假设我有以下代码:
unsigned char c = 0;
printf("%u\n", ~c);
GCC 打印值4294967295
,意味着它打印 的值ULONG_MAX
。
C11 6.3.1.3 有符号和无符号整数:
- 当一个整数类型的值转换为除 以外的其他整数类型
_Bool
时,如果该值可以用新的类型表示,则保持不变。- 否则,如果新类型是无符号的,则通过在新类型中可以表示的最大值的基础上反复加减一来转换该值,直到该值在新类型的范围内.60)
- 否则,新类型是有符号的,值不能在其中表示;结果是实现定义的,或者引发了实现定义的信号。
所以,c
提升到unsigned int
应用前的 operator ~
。因此结果是 的补码0u
。我对吗?还是未定义?