如果给一个无符号variables赋一个负值会发生什么?

我很好奇知道如果给一个无符号variables赋一个负值会发生什么。

代码看起来像这样。

unsigned int nVal = 0; nVal = -5; 

它没有给我任何编译器错误。 当我运行程序时, nVal被分配了一个奇怪的值! 难道一些2的补码值被赋值给nVal

正式答复 – 第4.7节[conv.integral]

“如果目标types是无符号的,则结果值是与源整数相等的最小无符号整数(模2 ^ n,其中n是用来表示无符号types的位数)[注意:在二进制补码表示中,这种转换是概念性的,并且位模式没有变化(如果没有截断)。 – 结束注释]

它会将表示-5(2的补码)的位模式分配给无符号整数。 这将是一个很大的无符号值。 对于32位整数,这将是2 ^ 32 – 5或4294967291

它将显示为最大无符号整数的值的正整数 – 4(值取决于计算机体系结构和编译器)。

BTW
你可以通过编写一个简单的C ++“hello world”types程序来检查它,并亲自查看

你是对的,有符号整数以2的补码forms存储, 无符号整数存储在无符号二进制表示中 。 C(和C ++)不区分这两者,所以最终的值就是二进制补码表示的无符号二进制值。

以下是我在Objective-C iOS 4.3上运行的内容

 unsigned long testValue = 0; NSLog(@"The value is: %lu", testValue); testValue -= 5; NSLog(@"The new value is: %lu", testValue); 

输出到控制台:

 The value is: 0 The new value is: 4294967291 

Hex中的新值是0xFFFFFFFB

-5是2的补码

是的,你是对的。 分配的实际值与除第三个以外的所有位一样。 -1是所有位设置(hex:0xFFFFFFFF),-2是除第一个以外的所有位等等。 你会看到的可能是hex值0xFFFFFFFB,十进制对应于4294967291。