(size_t)-1 和 ~0 之间有什么区别?
What's the difference between (size_t)-1 and ~0?
我见过 (size_t)-1
和 ~0
都用来表示大数,或者所有位都翻转的数字。
两者有什么区别吗?如果有,那是什么?
我发现了这个问题:What is the difference between -1 and ~0,但是它没有回答我的问题,因为我处理的是无符号整数(例如 size_t
),而不是有符号整数(例如 int
).
What's the difference between (size_t)-1 and ~0?
类型和值不同。
(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
并首先进行转换,将 -1 环绕到最大 size_t
值。
(size_t)-1
是 size_t
类型。它的值通常为 232-1 或 264-1(4294967295
或 18446744073709551615
)。
~0
的类型为 int
,并且在 2 的补码系统(即几乎无处不在)上具有值 -1
。
两者可能具有相同的位模式 - if int
和 size_t
的大小相同,但它们通常不是。
如果您想要类型 size_t
的最大值,您可以使用 SIZE_MAX
宏,定义在 <stdint.h>
中。如果您使用的是不提供 SIZE_MAX
的旧实现(C99 之前),(size_t)-1
将起作用。我不确定您为什么要写 ~0
而不是 -1
—— 除非您正在考虑非补码系统。
请注意,前面的答案假设一个 2 的补码机(现在很可能是这种情况,但不能保证)。
如果你有一台符号幅度机器,那么 -1
将设置一个符号位和最低有效位,所有其他清零,如果你有一个 1 的补码机器,那么 -1
将拥有所有位但设置了 LSB。
在所有这些情况下(包括常见的 2 的补码机),~0
已设置所有位。
我见过 (size_t)-1
和 ~0
都用来表示大数,或者所有位都翻转的数字。
两者有什么区别吗?如果有,那是什么?
我发现了这个问题:What is the difference between -1 and ~0,但是它没有回答我的问题,因为我处理的是无符号整数(例如 size_t
),而不是有符号整数(例如 int
).
What's the difference between (size_t)-1 and ~0?
类型和值不同。
(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
并首先进行转换,将 -1 环绕到最大 size_t
值。
(size_t)-1
是 size_t
类型。它的值通常为 232-1 或 264-1(4294967295
或 18446744073709551615
)。
~0
的类型为 int
,并且在 2 的补码系统(即几乎无处不在)上具有值 -1
。
两者可能具有相同的位模式 - if int
和 size_t
的大小相同,但它们通常不是。
如果您想要类型 size_t
的最大值,您可以使用 SIZE_MAX
宏,定义在 <stdint.h>
中。如果您使用的是不提供 SIZE_MAX
的旧实现(C99 之前),(size_t)-1
将起作用。我不确定您为什么要写 ~0
而不是 -1
—— 除非您正在考虑非补码系统。
请注意,前面的答案假设一个 2 的补码机(现在很可能是这种情况,但不能保证)。
如果你有一台符号幅度机器,那么 -1
将设置一个符号位和最低有效位,所有其他清零,如果你有一个 1 的补码机器,那么 -1
将拥有所有位但设置了 LSB。
在所有这些情况下(包括常见的 2 的补码机),~0
已设置所有位。