c - 为什么 unsigned int x = -1 和 int y = ~0 具有相同的二进制表示形式?

标签 c binary

在下面的代码段中将是:

  • 函数的结果
  • x 的值
  • y 的值
    {
         unsigned int x=-1;
         int y;
         y = ~0;
         if(x == y)
             printf("same");
         else
             printf("not same");
     }
a. same, MAXINT, -1
b. not same, MAXINT, -MAXINT
c. same , MAXUINT, -1
d. same, MAXUINT, MAXUINT
e. not same, MAXINT, MAXUINT

有人可以向我解释它是如何工作的还是可以只解释一下代码片段??

我知道这是关于二进制补码 n 等。 MAXINT 和 -1 的意义是什么? 这是因为 unsigned int 和 int 的东西——我说的对吗?

最佳答案

unsigned int x=-1;

1 是一个整型文字,类型为 int(因为它适合 int)。应用于 int 的一元 - 不会导致进一步提升,因此 -1 是一个 int,其值为 - 1

当转换为 unsigned int 时,使用模 2^N 算法,其中 N 是 unsigned int 中的值位数。 x 的值为 2^N - 1,即 UINT_MAX(什么是 MAX_UNIT?)。

int y;
y = ~0;

同样,0int 类型,在 C 中所有允许的 int 表示必须具有 int 的所有值位 将 0 表示为 0。同样,一元 ~ 不会发生提升,因此 ~0 是一个所有值位都为 1 的 int。它的值是什么取决于实现,但它是负数(符号位将被设置)所以绝对不是 UINT_MAXINT_MAX。此值未更改地存储在 y 中。

if(x == y)
    printf("same");
else
    printf("not same");

在此比较中,y 将被转换为 unsigned int,以便与已经是 unsigned int 的 x 进行比较。由于 y 有一个实现值,转换为 unsigned int 后的值仍然是实现定义的(尽管转换本身是模 2^N 并且完全指定)。比较的结果仍然是实现定义的。

总而言之:

implementation defined, UINT_MAX, implementation defined

在补码练习中:

not same, UINT_MAX, -0 (aka 0)

符号加大小:

not same, UINT_MAX, INT_MIN

补码:

same, UINT_MAX, -1

关于c - 为什么 unsigned int x = -1 和 int y = ~0 具有相同的二进制表示形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3141163/

相关文章:

c - 对 GetConsoleWindow 的 undefined reference

将类型结构转换为固定大小数组的内存位置

c++ - 从十进制转换的二进制中删除前导零

Python,Pairwise 'distance',需要一种快速的方法来完成

python - 将十六进制转换为二进制

c - 在多个循环环境中迭代三个值的最有效方法

c++ - 为什么 printf 函数族关心语言环境?

c - ALSA中period的含义

objective-c - 使用 ieee-754 或二进制补码将 NSData 转换为原始变量?

C - 解析任意图像文件