不是十六进制值0xffff?

时间:2011-11-03 20:24:40

标签: c++ c hex objective-c-category

我猜输出应该是“0000”但它的ffff不是~ffff-> 0000 0000 0000 0000

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

7 个答案:

答案 0 :(得分:15)

您需要将值分配回a

a = ~a;

即便如此,由于数据类型的大小,输出值可能如下所示:

ffff0000

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

答案 1 :(得分:7)

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

您想要a = ~a;

答案 2 :(得分:5)

蒂姆和弗拉德说,你没有做任何关于逐位反转的事情。

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

所以我希望你的输出是

  

FFFF0000

甚至

  

FFFFFFFFFFFF0000

如果需要16位按位运算,可以使用

#include <inttypes.h>
uint16_t a;

答案 3 :(得分:3)

因为您没有将值分配给a。你需要一个= ~a;

答案 4 :(得分:1)

~a本身是一个返回a的按位补码的语句。你可以指定一个~a(如@timcooper建议的那样),或者你可以

printf("%xn", ~a);

答案 5 :(得分:1)

正如其他人已经说过的那样,您需要将值重新分配到a = ~a;或使用printf("%x\n",~a);直接打印结果,但在任何一种情况下,您仍然不会得到零作为你期待。

〜运算符将翻转变量中的所有位。由于您最有可能处理32位整数,因此最终将使用0xFFFF0000,因为那些高16位将从零翻转为1。

答案 6 :(得分:0)

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