假设我有以下代码:
unsigned char c = 0;
printf("%u\n", ~c);
GCC打印值4294967295
,表示它打印ULONG_MAX
的值。
C11 6.3.1.3有符号和无符号整数:
- 当整数类型的值转换为
_Bool
以外的另一个整数类型时,如果该值可以由新值表示 类型,它没有变化。- 否则,如果新类型是无符号的,则通过重复添加或减去一个超过最大值的值来转换该值 可以用新类型表示,直到值在范围内 新类型 .60)
- 否则,新类型已签名且值无法在其中表示;结果是实现定义的还是 提出了实现定义的信号。
醇>
因此,在应用运算符c
之前,unsigned int
会提升为~
。就这样
结果是0u
的补码。我对吗?还是未定义?
答案 0 :(得分:4)
C不会在(无符号)char
类型中执行算术运算。根据整数提升,所有参数都首先被提升。 unsigned char
升级为int
,因此~x
的结果为-1。然后,您将此值打印为 unsigned int
,它会显示您观察到的输出。