无符号整数如何工作

时间:2014-04-02 02:47:35

标签: c++ objective-c c types

正如标题所示,我对unsigned int(或NSUIntegeru_int_blah之类的内容感到好奇,但我认为这些都是typedef的{​​{1}}事情)工作。例如,当它们的值低于零时,是否提出了一个例外?会发生错误吗?其中一个具体示例是将值间接设置为负数。

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


所以,我有三个问题。什么停止和unsigned int被分配给负数(unsigned int x = - 3)。如何实现此行为(通过编译器或其他方式)。将unsigned int(直接或间接)分配给负值时会发生什么。数据是否已损坏?它溢出了吗?
三江源

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:2)

指定负数时

unsigned int = -1;

您获得的数字为4294967295,或4 ^ 8 -1

因为整数的大小是4字节,或4 ^ 8 = 4294967296

如果该数字为负数

,则整数将环绕该数字

答案 2 :(得分:1)

在回答你的第一个代码示例时,循环将编译(但如果你使用gcc进行编译并且有-Wno-sign-compare标志,则会发出警告)。然而,运行它通常会导致循环根本不运行,因为大多数系统使用二进制补码(http://en.wikipedia.org/wiki/Two%27s_complement),这意味着-10与4294967286相同(假设4字节整数但通常为2 * INT_MAX - 10 )大于5。一般来说,我建议阅读Two's补码,因为它可能会回答你关于这个问题的所有问题。