我知道以下
unsigned short b=-5u;
由于下溢而计算为b为65531,但是我不明白5u是否在转换为-5之前转换为signed int然后重新转换回unsigned以存储在b或-5u中等于0 - 5u(不应该是这种情况,-x是一元运算符)
答案 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;
第一次操作将取决于短期的大小。如果短裤较小
而不是整数(通常,但并非总是如此),第一步是促进
k
到int
。 (如果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标准不要求signed
和unsigned
类型的位数相同,也不要求计算机使用2s补码表示有符号数 - 显然,如果它不使用2s补码,它赢了不符合你所显示的值,所以我假设你的是2s补码机 - 这是所有常见的处理器,如x86,68K,6502,Z80,PDP-11,VAX,29K,8051 ,ARM,MIPS。但从技术上讲,C没有必要正常运行]
当您使用一元运算符-x
时,它与0-x
具有相同的效果[这适用于计算机和数学 - 它具有相同的结果]。