如何补充0xff不是0x00?

Ngu*_* al 2 c

我不明白0xff的补码怎么不是0x00.这是代码:

uint8_t u8a;

u8a = 0xff;

printf( "%d\n", ~u8a );
if( ~u8a == 0x00 )
    printf( "Equal\n" );
else
    printf( "Not Equal\n" );
Run Code Online (Sandbox Code Playgroud)

printf语句显示"-256"和"不等于".我的理解中缺少什么?如果它被提升为int类型,为什么它会被提升为int类型?

dbu*_*ush 12

在应用~运算符之前,将值u8a提升为int.

C标准的 6.3.1.1节:

2以下内容可用于任何地方intunsigned int可能使用的表达方式:

  • 一个整型(比其它的对象或表达intunsigned int),其整数转换秩小于或等于的秩intunsigned int.

  • 类型的位字段_Bool,int,signed int,或unsigned int.

如果a int可以表示原始类型的所有值(由宽度限制,对于位字段),则该值将转换为int; 否则,它被转换为unsigned int.这些被称为 整数促销.

整数促销不会更改所有其他类型.

因为a uint8_t的排名低于int,并且因为所有可能的值都适合int,所以涉及此类型的任何表达式将始终按照int标准升级.

因此,假设a int是4个字节,则将值0xff提升为0x000000ff.将~运算符应用于该运算符0xffffff00.

因此,当您使用%d运算符打印此值时,它(正确地)被解释为-256.同样,此值不相同0x00,因此打印"不等于".

要获得您期望的结果,您需要将~操作符的结果转换回uint8_t.此外,您应该使用PRIu8格式说明符宏printf来准确反映您传入的值.

printf( "%" PRIu8 "\n", (uint8_t)~u8a );
if( (uint8_t)~u8a == 0x00 )
    printf( "Equal\n" );
else
    printf( "Not Equal\n" );
Run Code Online (Sandbox Code Playgroud)

结果:

0
Equal
Run Code Online (Sandbox Code Playgroud)