【问题标题】:Printing Bitwise NOT operator with hexadecimal format specifier [closed]使用十六进制格式说明符打印按位非运算符 [关闭]
【发布时间】:2015-09-17 15:32:39
【问题描述】:

如果我使用的是 m 而不是 ~m,那么代码会给出预期的十六进制值 32,但这里给出的是 ffffffdf 作为输出。

编辑 我知道按位 ~ NOT 运算符的工作原理。但我不明白这一点。有人能解释一下吗...??

#include<stdio.h>

int main()
{
    unsigned int m = 32;
    printf("%x\n", ~m); //ffffffdf is printed as output

    return 0;
}

【问题讨论】:

  • 你知道C语言中的~是什么吗?你说你愿意。那么问题是什么?
  • 您的预期结果是什么?
  • 我投票结束这个问题作为离题,因为它表明没有研究工作。
  • 如果你知道 ~ 是如何工作的,那你为什么要问这个?你拿了一个 int,记下了它,然后问它为什么不同......
  • @claj 整数是 什么 ?很多事情并不是每个人都清楚,但这并不意味着他们都提出了一个有效的 SO 问题。

标签: c


【解决方案1】:

在 C 中,~ 是按位非运算符。您说您了解此运算符的工作原理,但您的问题表明您不了解。那么让我们来看看这个例子:

首先,您将 m 声明为 unsigned int,它在您的平台上恰好是 32 位宽。你给它分配十进制值 32。变量 m 是 0x00000020。

然后,您将其打印出来。当您正常打印出来时,会出现预期的输出。但是当你用 ~ 操作符打印出来时,你会得到完全不同的东西。

~(按位非)运算符的作用与它在锡上所说的完全一样:它否定(翻转)每一位,因此 1 变为 0,0 变为 1。让我们看看这会对您的号码造成什么影响:

 m = 0b00000000000000000000000000100000 = 0x00000020
~m = 0b11111111111111111111111111011111 = 0xffffffdf

如您所见,结果与输出的内容完全匹配,这很好——这意味着您的编译器和 CPU 都按预期工作!

【讨论】:

    【解决方案2】:

    每个十六进制数字都是四位。由于您有 8 个十六进制数字,因此您的整数似乎是 8*4=32 位。

    32 的 NOT = 000000000000000000000000000010000 类似于 11111111111111111111111111101111,即上面的十六进制数字。

    【讨论】:

    • 000000000000000000000000000010000 十六进制?那将是F...FEFFFF
    • @EugeneSh.: 嗯.. 他不是在说十六进制吗?对不起;如果那是二元的,他应该说。在没有明确声明的情况下切换碱基是令人困惑的。
    猜你喜欢
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 2011-04-11
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    相关资源
    最近更新 更多