2014-04-02 32 views
4

正如標題所示,我很好奇unsigned int(或者像NSUInteger,u_int_blah,但我假設這些都是相同的東西都是typedef)的工作。例如,當它們的值降到零以下時,是否提高了豁免?會發生錯誤嗎?一個具體的例子就是間接地將該值設置爲負數。
無符號整數如何工作

for (unsigned int x = 5; x > -10; x--) { 
    // will x ever reach below zero, or will the loop terminate 
} 


此外,另一種方式來間接設置這將是具有所述用戶輸入它。

printf("Enter a number"); 
unsigned int x; 
scanf("%ud", &x); // user enters something like -29 


所以真的,我有三個問題。什麼停止和無符號int分配給負數(unsigned int x = - 3)。這種行爲是如何實現的(通過編譯器或其他方式)。當一個無符號整數被分配(直接或間接)爲負值時會發生什麼。數據是否損壞?它溢出嗎?
Thankyou

+0

可能duplica [是無符號整數減法定義的行爲?](http://stackoverflow.com/questions/7221409/is-unsigned-integer-subtraction-defined-behavior) –

+0

這個問題是問什麼時會發生什麼時,unsigned int減去和添加。我想知道它們是如何被編譯器強制執行的,以及當它們低於零時會發生什麼。 –

+0

當「結果是否定的」時,它是不是詢問「減去無符號整數」? –

回答

2

當分配一個負數

unsigned int = -1; 

你得到的數量將是4294967295,或4^8 -1

因爲整數的大小是4字節,或4^8 = 4294967296

整數將圍繞此數字,如果它是負數

+0

所以,你可以想象,如果循環的計數器進入負數,該值將變成非常大,如4294967295 ... 4294967294 ... 4294967293 ...等。它不會使程序崩潰,但你很難得到你想要的正確結果。 – John

1

回答你的第一個代碼示例,循環會編譯(儘管如果你用gcc編譯並且有-Wno-sign-compare標誌,會引發一個警告)。但是,運行它通常會導致循環根本不運行,因爲大多數系統使用二進制補碼(http://en.wikipedia.org/wiki/Two%27s_complement),這意味着-10與4294967286相同(假設4字節整數,但通常爲2 * INT_MAX - 10)總的來說,我建議你閱讀二補數,因爲它可能會回答你關於此問題的所有問題。

3

當一個無符號比較與簽名,他們將被轉換爲無符號。該過程與數據如何存儲在內存中有關。 在二進制,負號(如-3),將存儲,如:

-3 : 1111 1111 1111 1101 
3 : 0000 0000 0000 0011 

你可以告訴-3可以像:

// result : 0000 0000 0000 0011 

result = for_every_bit_of_3(not **ThisBit**); 
// result : 1111 1111 1111 1100 

result = result + 1; 
// result : 1111 1111 1111 1101 

所以循環:

for (unsigned int x = 5; x > -10; x--) { 
    // will x ever reach below zero, or will the loop terminate 
} 

會像

// 4,294,967,286 is what -10 cast to unsigned 
for (unsigned int x = 5; x > 4294967286; x--) { 
    // will x ever reach below zero, or will the loop terminate 
} 
+0

Thankyou解釋環繞行爲。 –

相關問題