无符号签名的下溢机制

时间:2013-03-02 09:33:40

标签: c++ c

我知道以下

unsigned short b=-5u;

由于下溢而计算为b为65531,但是我不明白5u是否在转换为-5之前转换为signed int然后重新转换回unsigned以存储在b或-5u中等于0 - 5u(不应该是这种情况,-x是一元运算符)

4 个答案:

答案 0 :(得分:5)

5u是一个无符号整数,-5u是它的否定。无符号整数的否定被定义为从2 ** n减去,它得到的结果与包装减法的结果相同零。

答案 1 :(得分:3)

5u是单个标记,是一个类型为unsigned int的右值表达式。 根据unsigned规则将一元-运算符应用于它 算术(算术模2 ^ n,其中 n 是。中的位数 无符号类型)。结果转换为unsigned short;如果他们不这样做 适合(并且如果sizeof(int) > sizeof(short)则不会),转换将会 也可以使用模运算来完成(模2 ^ n,其中 n 是数字 目标类型中的位)。

值得注意的是,如果原始参数的类型为unsigned short,则实际步骤会有所不同(尽管结果总是如此) 相同)。因此,如果您已经写过:

unsigned short k = 5;
unsigned short b = -k;

第一次操作将取决于短期的大小。如果短裤较小 而不是整数(通常,但并非总是如此),第一步是促进 kint。 (如果short和int的大小相同,那么第一个 步骤是将k提升为unsigned int;从此,一切 如上所述。)根据,{a。-将被应用于此int 有符号整数运算的规则(因此,得到-5的值)。该 结果-5将使用modulo隐式转换为unsigned short 算术,如上所述。

一般来说,这些区别并没有什么区别,但在你遇到的情况下 可能有INT_MIN的整数值,他们可以;在2的补充 机器-i,其中i的类型为int,值为INT_MIN 定义,并在以后转换为无符号时可能导致奇怪的值。

答案 2 :(得分:1)

ISO / IEC 14882-2003第4.7节说:

“如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 ^ n,其中n是用于表示无符号类型的位数)。[注意:在两个中补码表示,这种转换是概念性的,并且位模式没有变化(如果没有截断).-末端注释]

答案 3 :(得分:0)

技术上不是下溢,只是在显示为无符号数时签名值-5的表示。请注意,有符号和无符号数字具有相同的“位” - 它们只是以不同方式显示。如果您要将值打印为有符号值[假设它使用符号位进行扩展以填充剩余位],则会显示-5。 [这假设它是使用2s补码的典型机器。 C标准不要求signedunsigned类型的位数相同,也不要求计算机使用2s补码表示有符号数 - 显然,如果它不使用2s补码,它赢了不符合你所显示的值,所以我假设你的是2s补码机 - 这是所有常见的处理器,如x86,68K,6502,Z80,PDP-11,VAX,29K,8051 ,ARM,MIPS。但从技术上讲,C没有必要正常运行]

当您使用一元运算符-x时,它与0-x具有相同的效果[这适用于计算机和数学 - 它具有相同的结果]。