[英]Shift with 64 bit int
我有一個__int64變量x = 0x8000000000000000
。
我嘗試將其右移字節: x >> 4
我認為結果應該是0x0800000000000000
,但是不幸的是我得到了0xf800000000000000
。
我使用VS10。 為什么會這樣呢? 我該如何解決呢?
嘗試使用__uint64 variable x = 0x8000000000000000
我認為您也可以這樣聲明:
u64 x = 0x8000000000000000;
x >> 4
您將給您:
0x0800000000000000
看到這里的更多信息F
就從在的MSB。
好吧,這很容易。 :)
您的電話號碼已簽名。 設置第一位后,它為負。 因此,為了使其保持負值,將其填充為1s。
我假設將其強制轉換為無符號,然后再將其轉移即可解決您的問題。
原因是因為僅當左操作數至少為0時,才由語言定義移位帶符號的數字。在您的情況下,我假設它是一個二進制補碼表示形式,並且您的數字為負數,從而導致結果未指定(或我定義為實現,目前沒有參考資料)。 通常,您將獲得邏輯移位或算術移位。
如果您可以將變量設為無符號,那將解決您的問題。
這是因為您有一個負數。 轉換前使用無符號(或轉換為無符號)。
有符號的值右移符號位,無符號零:
int _tmain(int argc, _TCHAR* argv[])
{
__int64 signedval;
unsigned __int64 unsignedval;
signedval=0x8000000000000000 >> 4;
unsignedval=0x8000000000000000 >> 4;
printf(" Signed %x , unsigned %x \n", signedval, unsignedval);
getchar();
return 0;
}
輸出為:
Signed 0 , unsigned 8000000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.