我已经看到(size_t)-1
和~0
都用来表示大数字,或者数字都被翻转了。
两者之间有区别吗?如果是这样,那是什么?
我发现了一个问题:What is the difference between -1 and ~0,但是它没有回答我的问题,因为我正在处理无符号整数(例如size_t
),而不是有符号整数(例如{{1 }}。
答案 0 :(得分:6)
(size_t)-1和〜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
值。
答案 1 :(得分:3)
(size_t)-1
的类型为size_t
。通常,其值为2 32 -1或2 64 -1(4294967295
或18446744073709551615
)。
~0
的类型为int
,在2的补码系统(即几乎所有位置)上的值为-1
。
两者都可能具有相同的位模式-如果 int
和size_t
具有相同的大小,而通常它们却不相同。
如果要使用类型size_t
的最大值,可以使用SIZE_MAX
中定义的<stdint.h>
宏。如果您使用的旧版本实现(C99之前的版本)不提供SIZE_MAX
,则(size_t)-1
可以使用。我不确定为什么要编写~0
而不是-1
,除非您正在考虑使用非二进制补码系统。
答案 2 :(得分:2)
请注意,先前的答案假定为2的补码机(最近很可能是这种情况,但不能保证)。
如果您使用符号幅度机器,那么-1
将设置一个符号位和最低有效位,同时清除所有其他位;如果您使用1的补码机器,那么-1
将具有所有位,但是LSB集。
在所有这些情况下(包括公共2的补码机),~0
都设置了所有位。