c - C 中波浪号运算符查询的工作方式不同

标签 c operators tilde

我遇到了这个问题。 这段 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/

相关文章:

c - 为什么使用 "conio.h"不是编程的好习惯?

c - C程序编译警告:assignment makes pointer from integer without a cast [enabled by default]

python - 为什么 Python 中没有++ 和 --​ 运算符?

c - () 的优先级最高,为什么会短路?

java - 读写带有重音符号的文件

macos - 波浪号在 Mac 终端中无法识别

c++ - 将 strcmp C/C++ 用于 Arduino 时的数字通配符

c - 学习核心基础

r - 如何提供(逻辑)运算符作为函数的参数

javascript - 什么样的javascript数组使用波浪号~