![](/img/trans.png)
[英]right shift count >= width of type or left shift count >= width of type
[英]shift count greater than width of type
我有一個函數,它需要一個int data_length
並執行以下操作:
unsigned char *message = (unsigned char*)malloc(65535 * sizeof(char));
message[2] = (unsigned char)((data_length >> 56) & 255);
我得到以下內容:
warning: right shift count >= width of type [-Wshift-count-overflow]
message[2] = (unsigned char)((data_length >> 56) & 255);
該程序可以按預期工作,但是如何刪除編譯器警告(不禁用它)? 類似的問題似乎沒有使用變量作為要插入的數據,因此似乎解決方案是將其強制轉換為int或此類。
問題很簡單。 當使用data_length
進行無符號化(因為負長度幾乎沒有意義)時,您將其用作int
。 為了能夠移位56位,該值必須至少為56 57位寬。 否則,行為是不確定的。
在實踐中,已知處理器會做很多不同的事情。 在一個例子中,將32位值右移32位將清除變量。 在另一個值中,該值移位了0位( 32 % 32
!)。 然后,在某些情況下,也許處理器認為它是無效的操作碼,而OS終止了該進程。
簡單的解決方案:聲明uint64_t data_length
。
如果你真的有自己限制在32位數據類型,那么你可以指定0到這些字節即表示最顯著字節。 或者只是在轉換前unsigned long long
才uint64_t
轉換為uint64_t
或unsigned long long
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.