我遇到了这个问题。 这段 C 代码的输出是什么?
#include <stdio.h>
int main()
{
unsigned int a = 10;
a = ~a;
printf("%d\n", a);
}
我知道波浪号运算符的作用,现在 10 可以用二进制表示为 1010,如果我按位不是它,我会得到 0101,所以我不明白输出 -11。谁能解释一下?
最佳答案
按位取反 不会产生0101
。请注意,int 包含至少 16 位。因此,对于 16 位,它将生成:
a = 0000 0000 0000 1010
~a = 1111 1111 1111 0101
因此我们希望看到一个大数字(16 位即 65'525),但您使用 %d
作为格式说明符。这意味着您将整数解释为有符号 整数。现在有符号整数使用 two-complement representation [wiki] .这意味着设置最高位的每个整数都是负数,而且在这种情况下,该值等于 -1-(~x)
,所以 -11
。如果说明符是 %u
,则格式将是一个无符号整数。
编辑:喜欢@R。表示,%d
仅适用于无符号整数,如果它们也在有符号 整数范围内,则超出范围取决于实现。
关于c - C 中波浪号运算符查询的工作方式不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47762794/