簡體   English   中英

無符號長位移位

[英]Unsigned long and bit shifting

我有位移和無符號長的問題。 這是我的測試代碼:

char header[4];
header[0] = 0x80;
header[1] = 0x00;
header[2] = 0x00;
header[3] = 0x00;

unsigned long l1 = 0x80000000UL;
unsigned long l2 = ((unsigned long) header[0] << 24) + ((unsigned long) header[1] << 16) + ((unsigned long) header[2] << 8) + (unsigned long) header[3];

cout << l1 << endl;
cout << l2 << endl;

我希望l2也有2147483648的值,但它打印18446744071562067968。我假設第一個字節的位移會導致問題?

希望有人可以解釋為什么這會失敗以及我如何修改l2的計算以便它返回正確的值。

提前致謝。

存儲在char中的0x80值是帶符號的數量。 當您將其轉換為更寬的類型時,將對值進行擴展簽名以保持與較大類型相同的值。

將第一行中的char類型更改為unsigned char並且不會發生符號擴展。

要簡化您的案例中發生的事情,請運行以下命令:

char c = 0x80
unsigned long l = c
cout << l << endl;

你得到這個輸出:

18446744073709551488

-128為64位整數(0x80為-128為8位整數)。

這里的結果相同(Linux / x86-64,GCC 4.4.5)。 行為取決於unsigned long的大小, 至少為 32位,但可能更大

如果你想要32位,請使用uint32_t (來自頭文件<stdint.h> ;不是在C ++ 03中,而是在即將推出的標准中並得到廣泛支持)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM