(~INT_MAX&& INT_MAX)返回1?

时间:2018-01-26 21:11:13

标签: c expression numeric-limits

我的印象是INT_MAX将打开int的所有32位。如果我否定了这一点,并且'和'它本身,我应该将所有0与所有1进行比较并得到假。我错过了什么?

int x = INT_MAX;
x = ~x && INT_MAX;
printf("x = %d\n", x); /*Returns 1*/
x = 0;
x = ~x && INT_MAX;
printf("x = %d\n", x); /*Returns 1*/

编辑:哦,哇我也正在翻转标志位。使用UNIT_MAX给了我需要的结果。谢谢大家!

2 个答案:

答案 0 :(得分:4)

您在此处使用已签名注册; ~INT_MAX == INT_MIN编辑:对于两个补码,这是每个现代处理器使用的),而不是0.在C中,除0之外的所有值(包括底片)都将计算为true在条件中使用时。

如果您切换到无符号类型,那么自~UINT_MAX == 0以来所有内容都应按预期工作。

答案 1 :(得分:1)

  

我的印象是INT_MAX将打开一个int的所有32位。

没有;它只会打开int 1 的低31位 - 最高(符号)位将保留0表示正值。 ~INT_MAX对应~0x7FFFFFFF0x80000000

您正在考虑UINT_MAX

<小时/>

  1. 假设一个32位int;一些实现可以使用更宽的整数。