我曾看到过使用~0
作为生成所有1
位模式的一种低级按位表达式,然后用作掩码等用途。例如在K&R第45页:
/* getbits: get n bits from position p */
unsigned getbits(unsigned x, int p, int n)
{
return (x >> (p+1-n)) & ~(~0 << n);
}
在我的机器上,
(unsigned long) ~0
的计算结果为0x FF FF FF FF FF FF FF FF
。这使我们能够轻松生成比int
大的1
掩码,非常方便。然而,
(unsigned long) ~0
不应该计算为0x 00 00 00 00 FF FF FF FF
吗?没有任何后缀,0
被视为整数常量,因此~0
计算结果为0x FF FF FF FF
。为什么将其转换为unsigned long
不会简单地得到一个零填充值?我错过了什么?编辑:在我的机器上,
sizeof(int)
和sizeof(long)
分别为4和8。
(long)-1
将不等于-1L
。 - Iłya Bursov~0
会产生(int)0xffffffff = -1
。将其转换为无符号类型会产生唯一的无符号值,该值等于原始值对2^n取模,其中n是无符号位数。在您的情况下,n=64,等于-1
模2^64的唯一64位值是0xffffffffffffffff
。 - Raymond Chen(unsigned long)
,请使用ULONG_MAX
或者~0UL
或者-1UL
。避免使用_signed_常量来完成此任务。 - chux - Reinstate Monica