正如标题所示,我对unsigned int
(或NSUInteger
,u_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(直接或间接)分配给负值时会发生什么。数据是否已损坏?它溢出了吗?
三江源
答案 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补码,因为它可能会回答你关于这个问题的所有问题。