簡體   English   中英

用64位int移位

[英]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.

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