2017-07-04 179 views
1

我寫了這段代碼來了解位移。令我驚訝的是,即使我宣稱xunsigned int,輸出包含一個負數,即當最左邊的位被設置爲1.我的問題:爲什麼?我認爲unsigned int從來沒有消極。每sizeof(x),x是4個字節寬。爲什麼一個聲明爲unsigned int的變量產生一個負值?

以下是代碼片段:

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 
+3

因爲您將它打印爲有符號值。 –

+1

簡短的回答是因爲'printf()'沒有做任何類型檢查。 –

+0

https://stackoverflow.com/questions/14181691/why-does-printf-show-negative-values-for-unsigned-int –

回答

4

只要使用正確的轉換符號

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

您使用的是%i格式說明,它將其參數打印爲int

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

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

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

您必須明白,存儲在unsigned int內的內容只是位,不管符號是什麼,它們在使用時表現爲「無符號」的事實僅僅是對值的解釋。

因此,通過使用%i說明符,您將它視爲有符號值,無論它是如何聲明的。試用%u,它指定你想把它們當作unsigned

1

根據printf上的C++參考頁,在傳遞給printf的字符串中使用%i表示相應的參數將被視爲有符號的十進制整數。這意味着你的unsigned int將被轉換爲一個有符號的int。 在C++中,無符號簽名(和反向)只會改變解釋,而不是位值。因此,將最左邊的位設置爲1會使數字爲負數,因爲這與符號整數解釋中的對應關係相同。 要實現預期的編號,請使用%u代替無符號整數解釋。

+0

更好地使用C參考的C帖子比C++參考。 – chux

+0

@chux感謝您的建議。我明天會修好一段時間。 – xXliolauXx

相關問題