无符号整数如何工作

正如标题所暗示的那样,我很好奇一个unsigned int (或类似NSUIntegeru_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 

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

分配负数时

 unsigned int = -1; 

你得到的数字是4294967295,或4 ^ 8 -1

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

如果是负数,则整数将环绕该数字

当与签名的无符号比较时,它们都将被转换为无符号。 该过程与数据如何存储在内存中有关。 在二进制中,减号(如-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 } 

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