【问题标题】:What's the difference between (size_t)-1 and ~0?(size_t)-1 和 ~0 有什么区别?
【发布时间】:2019-09-04 19:47:46
【问题描述】:

我见过(size_t)-1~0 都用来表示大数,或所有位翻转的数字。

这两者有什么区别吗?如果有,是什么?

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

【问题讨论】:

标签: c unsigned ones-complement


【解决方案1】:

请注意,前面的答案假设是 2 的补码机器(现在很可能是这种情况,但不能保证)。

如果您有一个符号幅度机器,那么-1 将设置一个符号位和最低有效位,而所有其他位都清除,如果您有一个 1 的补码机器,那么-1 将设置除 LSB 之外的所有位。

在所有这些情况下(包括常见的 2 补码机器),~0 的所有位都已设置。

【讨论】:

  • 请注意,在我问的是 unsigned 整数的问题中,因此没有“符号位”之类的东西。
  • @JL2210 - 注意~0-1 的中间值都是有符号的,而不是无符号的。
  • 啊。我现在知道了。我会在编辑后立即投票。
  • 关于非 2 补码:我听说的最近的非 2 补码机器是在 2000-2008 年的某个地方,自 1990 年之前我就没有使用过。你知道过去 10 年有什么在使用吗?
【解决方案2】:

(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 值。

【讨论】:

【解决方案3】:

(size_t)-1 的类型为 size_t。它的值通常为 232-1 或 264-1(429496729518446744073709551615)。

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

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

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

【讨论】:

  • 感谢您告诉我。我会记得在我的stdint.h 实现中定义SIZE_MAX
  • 重新; ~0-1 - 一些编译器警告常量表达式中的隐式包装。
猜你喜欢
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 2010-10-15
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
相关资源
最近更新 更多