如果我为无符号变量赋值为负值会怎样?

ckv*_*ckv 73 c++ unsigned signed integer type-conversion

我很想知道如果我给无符号变量赋一个负值会发生什么.

代码看起来有点像这样.

unsigned int nVal = 0;
nVal = -5;
Run Code Online (Sandbox Code Playgroud)

它没有给我任何编译器错误.当我运行程序时,nVal分配了一个奇怪的值!是否可以将某个2的补码值分配给nVal

Den*_*ose 60

正式答案 - 第4.7节conv.integral

"如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 n,其中n是用于表示无符号类型的位数).[注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断).-end note]

这基本上意味着,如果在不是二的补(如符号量值,或一的补码)的方法,底层架构存储,转换为无符号必须表现得好像它是二进制补码.

  • *最小无符号整数与源整数*的含义是什么意思? (31认同)
  • @DavidRodríguez-dribeas例如,5和3是"全等模2",因为5%2和3%2都是1. (8认同)

Jas*_*eet 30

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

  • 简单是关键。这个答案有这个。(2^32 - 5) 比引用文档更好地解释了这种行为。 (3认同)
  • 比特与它无关。 (2认同)

per*_*iae 5

没错,有符号整数以 2 的补码形式存储,符号整数以无符号二进制表示形式存储。C(和 C++)不区分两者,因此您最终得到的值只是 2 的补码二进制表示的无符号二进制值。

  • 它可能不会存储在 2 的恭维中。 (16认同)
  • @JeremyF:不是“2”,“2 的赞美”。这是一个可以使用 Google 的术语,也是一种表示有符号整数的方式。 (4认同)