2

假设我有以下代码:

unsigned char c = 0;
printf("%u\n", ~c);

GCC 打印值4294967295,意味着它打印 的值ULONG_MAX

C11 6.3.1.3 有符号和无符号整数:

  1. 当一个整数类型的值转换为除 以外的其他整数类型_Bool时,如果该值可以用新的类型表示,则保持不变。
  2. 否则,如果新类型是无符号的,则通过在新类型中可以表示的最大值的基础上反复加减一来转换该值,直到该值在新类型的范围内.60)
  3. 否则,新类型是有符号的,值不能在其中表示;结果是实现定义的,或者引发了实现定义的信号。

所以,c提升到unsigned int应用前的 operator ~。因此结果是 的补码0u。我对吗?还是未定义?

4

1 回答 1

4

C 不执行(无符号)char类型的算术运算。根据整数提升,首先提升所有参数。 unsigned char提升为int,因此 的结果~x为 -1。然后,您将此值打印为unsigned int,这会给出您观察到的输出。

于 2017-11-04T07:32:12.847 回答