{size_t)-1和〜0有什么区别?

时间:2019-04-14 18:50:37

标签: c unsigned ones-complement

我已经看到(size_t)-1~0都用来表示大数字,或者数字都被翻转了。

两者之间有区别吗?如果是这样,那是什么?

我发现了一个问题:What is the difference between -1 and ~0,但是它没有回答我的问题,因为我正在处理无符号整数(例如size_t),而不是有符号整数(例如{{1 }}。

3 个答案:

答案 0 :(得分:6)

  

(size_t)-1和〜0有什么区别?

类型和值不同。

(size_t)-1SIZE_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(429496729518446744073709551615)。

~0的类型为int,在2的补码系统(即几乎所有位置)上的值为-1

两者都可能具有相同的位模式-如果 intsize_t具有相同的大小,而通常它们却不相同。

如果要使用类型size_t的最大值,可以使用SIZE_MAX中定义的<stdint.h>宏。如果您使用的旧版本实现(C99之前的版本)不提供SIZE_MAX,则(size_t)-1可以使用。我不确定为什么要编写~0而不是-1,除非您正在考虑使用非二进制补码系统。

答案 2 :(得分:2)

请注意,先前的答案假定为2的补码机(最近很可能是这种情况,但不能保证)。

如果您使用符号幅度机器,那么-1将设置一个符号位和最低有效位,同时清除所有其他位;如果您使用1的补码机器,那么-1将具有所有位,但是LSB集。

在所有这些情况下(包括公共2的补码机),~0都设置了所有位。