(~INT_MAX && INT_MAX) returns 1?
(~INT_MAX && INT_MAX) returns 1?
我的印象是 INT_MAX 会打开 int 的所有 32 位。如果我否定它并且 'and' 它本身,我应该将所有 0 与所有 1 进行比较并返回 false。我错过了什么?
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 可以得到我需要的结果。谢谢大家!
您正在使用 signed 整数; ~INT_MAX == INT_MIN
(edit:对于二进制补码,每个现代处理器都使用它),而不是 0。在 C 中,除 0 之外的所有值,包括负数,在以下情况下都将计算为真用于条件。
如果您切换到无符号类型,自 ~UINT_MAX == 0
.
以来一切都应该按预期工作
I am under the impression that INT_MAX will turn on all 32 bits of an int.
没有;它只会打开 int
1 的低 31 位 - 最高(符号)位将保留为 0 以表示正值。 ~INT_MAX
对应~0x7FFFFFFF
,或0x80000000
。
您正在考虑 UINT_MAX
。
- 假设一个32位
int
;一些实现可能使用更宽的整数。
我的印象是 INT_MAX 会打开 int 的所有 32 位。如果我否定它并且 'and' 它本身,我应该将所有 0 与所有 1 进行比较并返回 false。我错过了什么?
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 可以得到我需要的结果。谢谢大家!
您正在使用 signed 整数; ~INT_MAX == INT_MIN
(edit:对于二进制补码,每个现代处理器都使用它),而不是 0。在 C 中,除 0 之外的所有值,包括负数,在以下情况下都将计算为真用于条件。
如果您切换到无符号类型,自 ~UINT_MAX == 0
.
I am under the impression that INT_MAX will turn on all 32 bits of an int.
没有;它只会打开 int
1 的低 31 位 - 最高(符号)位将保留为 0 以表示正值。 ~INT_MAX
对应~0x7FFFFFFF
,或0x80000000
。
您正在考虑 UINT_MAX
。
- 假设一个32位
int
;一些实现可能使用更宽的整数。