在下面的代码段中将是:
- 函数的结果
- 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;
同样,0
是 int
类型,在 C 中所有允许的 int
表示必须具有 int 的所有值位
将 0 表示为 0。同样,一元 ~
不会发生提升,因此 ~0
是一个所有值位都为 1 的 int
。它的值是什么取决于实现,但它是负数(符号位将被设置)所以绝对不是 UINT_MAX
或 INT_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/