int main() {
unsigned int i = 1;
typeof(-i) j = -i;
}
Run Code Online (Sandbox Code Playgroud)
当我查看jgdb中的类型时,它显示为type unsigned int。为什么类型没有移动到相应的带符号类型?选择这种行为背后有什么原因吗?我发现该类型是否可以更直观地转换为相应的带符号类型。
一元-求反运算符除了应用整数提升外,不会更改其参数的类型。C标准的 6.5.3.3p3节规定:
一元运算
-符的结果为其(提升的)操作数的负数。对操作数执行整数提升,并且结果具有提升的类型
整数促销的详细信息在6.3.1.1p2节中进行了详细说明:
在可以使用
int或 的表达式中unsigned int可以使用以下代码:
- 一个对象或表达一个整型(除
int或unsigned int),其整数转换秩小于或等于的秩int和unsigned int。- 类型的位字段
_Bool,int,signed int,或unsigned int。如果an
int可以代表原始类型的所有值(受位字段的宽度限制),则该值将转换为anint。否则,它将转换为unsigned int。这些称为整数促销。整数促销未更改所有其他类型。
的类型的iIS unsigned int根据上述通道,该通道是不受整数促销(实际上,它是整数优惠的目的地类型)。因此,不会执行任何升级,并且的类型与的类型-i相同i。