64位无符号整数可以有多大?

Wor*_*ice 3 c

我很清楚64位有符号整数可以有多大? 多亏了这个问题及其简单明了的答案。

因此,据此,我可以说an unsigned int可以是2 ^ 64-1,而不是2 ^ 63-1吗?

2^63 - 1:    0111111111111111111111111111111111111111111111111111111111111111

2^64 - 1:    1111111111111111111111111111111111111111111111111111111111111111
Run Code Online (Sandbox Code Playgroud)

当且仅当我正确地获得它时,如何才能检测到未签名的溢出?以二进制补码表示的带符号整数的溢出将侵入最高位位置,并返回负数。但是这种未签名的情况如何?

Yun*_*sch 9

通过查看值很难或不可能检测到。
问题是最大值加上即使只有 1 仍然/再次是有效值;即 0。

这就是为什么大多数程序员尽可能避免,如果它实际上是一个错误的值。对于某些应用程序,环绕是逻辑的一部分并且很好。

如果您计算例如c=a+b;(a、b、c 是 64 位无符号整数,而 a、b 令人担忧地接近 max 或 migth 是)并想知道结果是否受到影响,
则检查是否((max - b) < a);用max是合适的编译器提供符号。

不要自己将最大值计算为 2^64-1,这将是特定于实现和平台的。最重要的是,它将包含两次环绕(2^64 超出最大值,可能为 0;并通过 0 返回减去 1...)。即使^被理解为“to the power of”的适当版本,这也适用。

  • 64 位无符号整数实现特定或平台特定的最大值如何? (2认同)

Hav*_*ard 6

有符号整数只能达到2^63-1(9,223,372,036,854,775,807),因为最高有效位保留给该符号。如果该位为1负,则该数字为负,并且可以低至-2^63(-9,223,372,036,854,775,808)。

在带符号的64位整数上,2^64-1实际上是number -1

但是,如果使用无符号整数,则该值起始于,0并且2^64-1(18,446,744,073,709,551,615)变为最大值,但无符号整数不能表示负值。


Mar*_*som 5

您对有符号和无符号整数的最大大小的假设是正确的。实际值为 9223372036854775807(有符号)和 18446744073709551615(无符号)。

检测无符号加法的溢出相当简单 - 如果结果小于任一操作数,则存在溢出。

减法是类似的,如果结果大于第一个操作数,那么你就溢出了。

乘法很难,我不知道一个简单的规则。

除非除以零,否则除法不可能溢出。


Lan*_*ard 5

它可以18446744073709551615

18,446,744,073,709,551,615
q5 q4  t   b   m   t   h
Run Code Online (Sandbox Code Playgroud)