C++ 为什么(-i)的类型(其中i是无符号int)仍然是无符号int?
当我查看gdb中的C++ 为什么(-i)的类型(其中i是无符号int)仍然是无符号int?,c++,c,clang,C++,C,Clang,当我查看gdb中的j类型时,它显示为unsigned int类型。为什么类型没有移动到相应的有符号类型?选择这种行为背后有什么原因吗?我发现如果将类型转换为相应的有符号类型,会更直观 一元否定运算符-除了应用整数提升外,不会改变其参数的类型。第6.5.3.3p3节规定: 一元-运算符的结果是其(提升)的负数 操作数。整数提升在操作数上执行,而 结果为升级类型 integer促销详情见第6.3.1.1p2节: 在表达式中使用int或 unsigned int可用于: 具有整数类型(除int或无符
j
类型时,它显示为unsigned int
类型。为什么类型没有移动到相应的有符号类型?选择这种行为背后有什么原因吗?我发现如果将类型转换为相应的有符号类型,会更直观 一元否定运算符-
除了应用整数提升外,不会改变其参数的类型。第6.5.3.3p3节规定:
一元-
运算符的结果是其(提升)的负数
操作数。整数提升在操作数上执行,而
结果为升级类型
integer促销详情见第6.3.1.1p2节:
在表达式中使用int
或
unsigned int
可用于:
- 具有整数类型(除
或int
外)的对象或表达式,其整数转换秩小于或等于无符号int
和int
的秩无符号int
- 类型为
、\u Bool
、int
或有符号int
的位字段无符号int
int
可以表示原始类型的所有值(如
受宽度限制(对于位字段),值转换为
一个int
;否则,它将转换为无符号int
。这些是
称为整数促销。所有其他类型由
整数促销
i
的类型是unsigned int
,根据上面的文章,它不受整数提升的影响(实际上,它是整数提升的目标类型)。因此,不会执行任何提升,并且-i
的类型与i
的类型相同。无符号类型的求反不会产生有符号的负值,因为无符号求反有意义且有用
首先,对于给定的无符号值a
存在一个无符号值b
,使得a+b==0
。将b
标识为-a
,反之亦然,这是类型的模运算下的一种加法逆运算
无符号算术可以模拟二的补码;在这种情况下,否定充当二的补码运算符:它“翻转所有位并加一”。例如,
-0x1U
也是0xFF…FFU
,因为i
的值在整数提升后仍然是无符号类型(unsigned int
),数值i
的数学负数将被转换为无符号类型,方法是重复添加一个大于无符号类型中可表示的最大值,直到该数值在6.3.1.3p2规定的无符号类型范围内(虽然在本例中,这实际上只是对无符号类型的值执行2的补码运算)。都是真的,但问题是为什么。@LightnessRaceswithMonica:是的,我希望更多的受访者关注所问(或预期)的问题,而不是机械地写技术回答。
int main() {
unsigned int i = 1;
typeof(-i) j = -i;
}