我见过这两种情况(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)-1 和 ~0 有什么区别?
类型和值不同。
(size_t)-1
与 的值相同,SIZE_MAX
并且类型为size_t
。
~0
通常为 -1 并且类型为int
.
将这两个都分配给 asize_t
将导致SIZE_MAX
.
size_t a = (size_t)-1;
size_t b = ~0;
在第二种情况下,-1
分配给 ab
并首先进行转换,将 -1 环绕到最大值size_t
。
(size_t)-1
是类型size_t
。它的值通常为 2 32 -1 或 2 64 -1(4294967295
或18446744073709551615
)。
~0
是 type int
,并且-1
在 2 的补码系统上具有值(即,几乎无处不在)。
两者都可能具有相同的位模式——如果 int
和size_t
是相同的大小,但它们通常不是。
如果你想要 type 的最大值size_t
,你可以使用SIZE_MAX
宏,定义在<stdint.h>
. 如果您使用的是不提供的旧实现(C99 之前),则SIZE_MAX
可以(size_t)-1
使用。我不确定您为什么要编写~0
而不是-1
- 除非您正在考虑非二进制补码系统。
请注意,前面的答案假设一个 2 的补码机器(现在很可能是这种情况,但不能保证)。
如果您有一个符号幅度机器,那么-1
将设置一个符号位和最低有效位,而所有其他位都清除,如果您有一个 1 的补码机器,那么-1
将设置除 LSB 之外的所有位。
在所有这些情况下(包括常见的 2 的补码机器),~0
所有位都已设置。