C中的无符号char 1的补码

时间:2017-11-04 07:16:31

标签: c bit-manipulation unsigned complement

假设我有以下代码:

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

GCC打印值4294967295,表示它打印ULONG_MAX的值。

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

  
      
  1. 当整数类型的值转换为_Bool以外的另一个整数类型时,如果该值可以由新值表示   类型,它没有变化。
  2.   
  3. 否则,如果新类型是无符号的,则通过重复添加或减去一个超过最大值的值来转换该值   可以用新类型表示,直到值在范围内   新类型 .60)
  4.   
  5. 否则,新类型已签名且值无法在其中表示;结果是实现定义的还是   提出了实现定义的信号。
  6.   

因此,在应用运算符c之前,unsigned int会提升为~。就这样 结果是0u的补码。我对吗?还是未定义?

1 个答案:

答案 0 :(得分:4)

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