我看到过 (size_t)-1
和 ~0
两种方式用来表示大数字,或是所有位都被翻转的数字。
这两种方式有什么区别吗?如果有,是什么?
我找到了这个问题:What is the difference between -1 and ~0,但它并没有回答我的问题,因为我正在处理无符号整数(如 size_t
),而不是带符号整数(如 int
)。
我看到过 (size_t)-1
和 ~0
两种方式用来表示大数字,或是所有位都被翻转的数字。
这两种方式有什么区别吗?如果有,是什么?
我找到了这个问题:What is the difference between -1 and ~0,但它并没有回答我的问题,因为我正在处理无符号整数(如 size_t
),而不是带符号整数(如 int
)。
size_t a = (size_t)-1;
size_t b = ~0;
-1
被分配给 b
并首先进行转换,将其转换为 size_t
的最大值。(size_t)-1
的类型是 size_t
,通常它的值为2的32次方减1或者2的64次方减1(分别为4294967295
和18446744073709551615
)。
~0
的类型是 int
,在二进制补码系统中(即几乎所有地方),其值为-1
。
如果 int
和 size_t
的大小相同,则两者可能具有相同的比特模式,但它们通常大小不相同。
如果您想要 size_t
类型的最大值,则可以使用在 <stdint.h>
中定义的 SIZE_MAX
宏。如果您使用的是旧版本实现(C99 之前)不提供 SIZE_MAX
的编译器,则可以使用 (size_t)-1
。我不确定为什么您会想写 ~0
而不是 -1
—— 除非您考虑的是非二进制补码系统。
stdint.h
实现中定义 SIZE_MAX
。 - S.S. Anne~0
和-1
的区别 - 一些编译器会在常量表达式中警告隐式包装。 - TLW-1
将具有带有所有其他位清除的标志位和最低有效位的设置,如果您使用的是1的补码机器,则-1
将设置除LSB之外的所有位。~0
将设置所有位。"最初的回答"~0
和-1
的中间值是有符号的,而不是无符号的。 - TLW
~0
是有符号的数量 - 您需要使用~0U
来使其无符号。 - Jonathan Leffler~0
而不是~0U
的答案,我认为最好将其保持不变,但请注意在今后要小心。在更改问题会使答案无效之前,您可以更改问题。 - Jonathan Leffler