“(size_t)-1” 和 “~0” 有什么区别?

6

我看到过 (size_t)-1~0 两种方式用来表示大数字,或是所有位都被翻转的数字。

这两种方式有什么区别吗?如果有,是什么?

我找到了这个问题:What is the difference between -1 and ~0,但它并没有回答我的问题,因为我正在处理无符号整数(如 size_t),而不是带符号整数(如 int)。


1
请注意,~0 是有符号的数量 - 您需要使用 ~0U 来使其无符号。 - Jonathan Leffler
我应该编辑它吗? - S.S. Anne
3
由于您已经得到了一些针对~0而不是~0U的答案,我认为最好将其保持不变,但请注意在今后要小心。在更改问题会使答案无效之前,您可以更改问题。 - Jonathan Leffler
不同之处:第一个是C++。第二个不是无符号的。 - S.S. Anne
3个回答

6
区别在于类型和值不同。
`(size_t)-1` 的值与 `SIZE_MAX` 相同,类型为 `size_t`。
`~0` 通常为 -1,类型为 `int`。
将两者赋值给 `size_t` 变量将导致结果为 `SIZE_MAX`。
size_t a = (size_t)-1; 
size_t b = ~0;

在第二种情况下,-1 被分配给 b 并首先进行转换,将其转换为 size_t 的最大值。

评论不适合进行长时间的讨论;此对话已被移至聊天室 - Bhargav Rao

3

(size_t)-1 的类型是 size_t,通常它的值为2的32次方减1或者2的64次方减1(分别为429496729518446744073709551615)。

~0 的类型是 int,在二进制补码系统中(即几乎所有地方),其值为-1

如果 intsize_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

2
请注意,先前的回答假设使用的是2进制补码机器(现在很可能是这种情况,但不能保证)。
如果你使用的是符号-幅值机器,则-1将具有带有所有其他位清除的标志位和最低有效位的设置,如果您使用的是1的补码机器,则-1将设置除LSB之外的所有位。
在所有这些情况中(包括常见的2进制补码机器),~0将设置所有位。"最初的回答"

请注意,我在问题中询问的是“无符号”整数,因此不存在“符号位”的概念。 - S.S. Anne
2
@JL2210 - 请注意,~0-1的中间值是有符号的,而不是无符号的。 - TLW
啊,我明白了。一旦这个被编辑过,我会点赞的。 - S.S. Anne
关于非二进制补码:我听说过的最近的非二进制补码机器是在2000-2008年左右,自1990年代以来我就没有使用过了。你知道最近10年里有没有在使用的吗? - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接