不是十六进制值0xffff

Not of hexadecimal value 0xffff?

本文关键字:0xffff 十六进制      更新时间:2023-10-16

我猜输出应该是"0000",但它是ffff,而不是~ffff->0000 0000 0000 0000

#include<stdio.h>
int main()
{
    unsigned int a=0xffff;
    ~a;
    printf("%xn", a);
    return 0;
}

您需要将值重新分配给a:

a = ~a;

即使这样,由于数据类型的大小,输出值可能看起来像这样:

ffff0000

要使其按预期工作(全部为0),将a的初始值设置为UINT_MAX(从limits.h)。这样做将所有位设置为1

输入~a;无效。它是一个表达式,返回a的补码,但不改变a本身。

你想要a = ~a;

就像Tim和Vlad说的,你并没有对逐位反转做任何事情。

即使您将代码更改为a = ~a;,您也可能不会得到零。这是因为如果unsigned int超过16位,你将有前导零,反转后变成1。

所以我希望你的输出是

FFFF0000

或者

FFFFFFFFFFFF0000

如果需要16位的按位操作,可以使用

#include <inttypes.h>
uint16_t a;

因为您没有将值赋给a。您需要a = ~a;

~a本身是返回a的按位补码的语句。您可以将a分配给~a(如@timcooper建议的),或者您可以

printf("%xn", ~a);

正如其他人已经说过的,您需要使用a = ~a;将值赋回给a或直接使用printf("%xn",~a);打印结果,但无论哪种情况,您仍然不会像您期望的那样得到零。

~操作符将翻转变量中的所有位。因为你最有可能处理的是32位整数,你最终会得到0xFFFF0000,因为上面的16位将从0翻转为1。

#include<stdio.h>
int main()
{
    unsigned short int a= 0xffff;
    a=~a;
    printf("%xn", a);
    return 0;
}