无符号整数如何工作
正如标题所暗示的那样,我很好奇一个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
所以,我有三个问题。 什么停止和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的补码,因为它可能会回答你关于此事的所有问题。