C++ 为什么(-i)的类型(其中i是无符号int)仍然是无符号int?

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或无符

当我查看gdb中的
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;
}