【问题标题】:Not of hexadecimal value 0xffff?不是十六进制值 0xffff?
【发布时间】:2011-12-21 12:44:31
【问题描述】:

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

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

【问题讨论】:

  • 一个有用的提示 - 在 gcc 中使用 -Wall 编译会在您有无效的语句时警告您。 “thing.c:6:3:警告:声明无效”。

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


【解决方案1】:
#include<stdio.h>
int main()
{
    unsigned short int a= 0xffff;
    a=~a;
    printf("%x\n", a);
    return 0;
}

【讨论】:

  • 您能否在建议的代码周围添加更多上下文。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    正如 Tim 和 Vlad 所说,您没有对按位反转做任何事情。

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

    所以我希望你的输出是

    FFFF0000

    甚至

    FFFFFFFFFFFF0000

    如果你想要 16 位的按位运算,你可以使用

    #include <inttypes.h>
    uint16_t a;
    

    【讨论】:

      【解决方案4】:

      ~a 本身就是一个返回 a 的按位补码的语句。您可以将 a 分配给 ~a(如 @timcooper 建议的那样),也可以

      printf("%xn", ~a);
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          你想要a = ~a;

          【讨论】:

            【解决方案7】:

            您需要将值分配回a

            a = ~a;
            

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

            ffff0000
            

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

            【讨论】:

            • 是的,我也这样做了,输出是“ffff0000”,我无法理解逻辑。
            • 您也可以将初始值设置为~0
            猜你喜欢
            • 2016-06-13
            • 1970-01-01
            • 2018-07-26
            • 2011-04-14
            • 1970-01-01
            • 2016-06-11
            • 2013-03-31
            • 1970-01-01
            相关资源
            最近更新 更多