c-位运算符~出错



我正在学习C中的逐位运算符。当我计算~4的结果时,我得到11,当我在网站上计算时,我也得到相同的结果。但我的编译器给了我错误的结果,每次编译时我都得到5。我认为我的编译器设置是错误的。我在网上搜索了一下这个问题,但什么也没找到。

我能做些什么来解决这个问题?

int x = ~4;
printf("%dn", x);

您没有考虑到数据类型具有一定的大小,该大小是独立于其内容而固定的。

在大多数现代系统上,int具有32位。这意味着您的4表示为

00000000 00000000 00000000 00000100

当你做~时,你会得到

11111111 11111111 11111111 11111011

由于int是一种有符号的数据类型,并且(在大多数现代系统上)2的补码用于表示负值,因此显示为-5

正确答案应该是-5。

4 = 00000000 00000000 00000000 00000100
~4 = 11111111 11111111 11111111 11111011

这是-5的二进制表示,使用32位有符号整数。对于有符号整数,~x=-x-1

这可能是向您展示的最简单方法

#include <stdio.h>

int main() {
printf("%on", 4);
printf("%o %dn", ~4, ~4);
printf("%o %dn", 4 + ~4, 4 + ~4);
return 0;
}

将显示:

4
37777777773 -5
37777777777 -1

如果你在八进制编码的最后一个八进制3上加上4,你就会得到7,因此补码是按预期应用的。为什么第二个数字看起来如此奇怪,那是因为它被编码为两个互补数字。

相关内容

  • 没有找到相关文章

最新更新