簡體   English   中英

為什么將變量聲明為無符號int生成負值?

[英]Why is a variable declared as an unsigned int generating a negative value?

我寫了這段代碼來學習移位。 令我驚訝的是,即使我將x聲明為unsigned int ,輸出也包含一個負數,即當最左邊的位設置為1時。我的問題:為什么? 我認為一個unsigned int永遠不會是負數。 sizeof(x)x為4字節寬。

這是代碼片段:

int main(void)
{
    unsigned int x;

    x = 1;

    for (int i = 0; i < 32; i++)
    {
        printf("2^%i = %i\n", i, x);
        x <<= 1;
    }


    return 0;
}

這是輸出:

2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
2^5 = 32
2^6 = 64
2^7 = 128
2^8 = 256
2^9 = 512
2^10 = 1024
2^11 = 2048
2^12 = 4096
2^13 = 8192
2^14 = 16384
2^15 = 32768
2^16 = 65536
2^17 = 131072
2^18 = 262144
2^19 = 524288
2^20 = 1048576
2^21 = 2097152
2^22 = 4194304
2^23 = 8388608
2^24 = 16777216
2^25 = 33554432
2^26 = 67108864
2^27 = 134217728
2^28 = 268435456
2^29 = 536870912
2^30 = 1073741824
2^31 = -2147483648

只需使用正確的轉換符號

printf("2^%u = %u\n", i, x);

您正在使用%i格式說明符,該說明符將其參數打印為帶符號的int

如果要以無符號形式打印,請使用%u格式說明符。

printf("2^%i = %u\n", i, x);

當您談論C(C ++和許多其他編程語言)中整數值的符號時,您只是在談論如何解釋某些數據。

您必須了解, unsigned int內存儲的只是位而與符號無關,使用時它們表現為“無符號”的事實僅僅是對值的解釋。

因此,通過使用%i說明符,您將其視為帶符號的值,無論如何聲明它。 嘗試使用%u ,它指定您要將它們視為unsigned

根據printf的C ++參考頁,在傳遞給printf的字符串中使用%i意味着相應的參數將被視為帶符號的十進制整數。 這意味着您的unsigned int將被強制轉換為signed int。 在C ++中,將無符號轉換為有符號(和反向)只會更改解釋,而不會更改位值。 因此,將最左邊的位設置為1會使數字變為負數,因為這與有符號整數解釋中的數字相對應。 要獲得預期的數字,請使用%u代替無符號整數解釋。

暫無
暫無

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

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