为什么(-i)的类型(其中i是无符号整数)仍然是无符号整数?

0xh*_*ker 0 c c++ clang

int main() {
    unsigned int i = 1;
    typeof(-i) j = -i;
}
Run Code Online (Sandbox Code Playgroud)

当我查看jgdb中的类型时,它显示为type unsigned int。为什么类型没有移动到相应的带符号类型?选择这种行为背后有什么原因吗?我发现该类型是否可以更直观地转换为相应的带符号类型。

dbu*_*ush 5

一元-求反运算符除了应用整数提升外,不会更改其参数的类型。C标准的 6.5.3.3p3节规定:

一元运算-符的结果为其(提升的)操作数的负数。对操作数执行整数提升,并且结果具有提升的类型

整数促销的详细信息在6.3.1.1p2节中进行了详细说明:

在可以使用int或 的表达式中unsigned int可以使用以下代码:

  • 一个对象或表达一个整型(除intunsigned int),其整数转换秩小于或等于的秩intunsigned int
  • 类型的位字段_Boolintsigned int,或unsigned int

如果an int可以代表原始类型的所有值(受位字段的宽度限制),则该值将转换为an int。否则,它将转换为unsigned int。这些称为整数促销。整数促销未更改所有其他类型。

的类型的iIS unsigned int根据上述通道,该通道是不受整数促销(实际上,它是整数优惠的目的地类型)。因此,不会执行任何升级,并且的类型与的类型-i相同i