【问题标题】:unsigned long larger than 0xFFFFFFFFunsigned long 大于 0xFFFFFFFF
【发布时间】:2019-11-24 10:39:09
【问题描述】:

如果 unsigned long 最大值为 4294967295,测试程序如何得出 4294967297?

#include <iostream>
using namespace std;
unsigned long millis_diff(unsigned long then, unsigned long now) {
    return now < then ? now + then : now - then;
}
int main()
{
    unsigned long now = 2;
    unsigned long then = 4294967295; //unsigned long maximum value
    unsigned long diff = millis_diff(then, now);
    cout << diff;
    return 0;
}

【问题讨论】:

  • "unsigned long 最大值为 4294967295" 这通常是不正确的前提。
  • C++ 为您提供整数类型的两个保证。首先是条件sizeof(char) &lt;= sizeof(short) &amp;&amp; sizeof(short) &lt;= sizeof(int) &amp;&amp; sizeof(int) &lt;= sizeof(long) &amp;&amp; sizeof(long) &lt;= sizeof(long long) 将是true。第二个是long 将是至少 32 位数据类型。 long 也可以是 64 位。
  • 关于unsigned long 的唯一保证是它大于或等于unsigned int。实际大小由实现定义。
  • @EugeneX,整数大小表高度依赖于架构和 ABI。在所有平台上都不尽相同。
  • 有些目标系统(通常是 DPS)char 可能是 16 位。在旧系统中,“字符”可以是 6、7 或 9 位,而“字”(通常是 int)可以是 18 或 36 位。简而言之,整数类型在规范中没有固定大小,只有最小大小。请记住,即使 char 可以是任意位数,sizeof(char)始终等于 1

标签: c++ integer overflow sizeof


【解决方案1】:

原因是您的编译器定义unsigned long int 的方式似乎与定义unsigned long long int 的方式相同。:)

这是一个演示程序

#include <iostream>
#include <limits>

int main()
{
    std::cout << "sizeof( unsigned long ) = " << sizeof( unsigned long ) << '\n';
    std::cout << "The maximum values is " << std::numeric_limits<unsigned long>::max() << '\n';
}

它的输出是

sizeof( unsigned long ) = 8
The maximum values is 18446744073709551615

【讨论】:

  • 谢谢你的描述,现在我知道 ulong 是 8 个字节长...
  • Now I will know that ulong is 8 bytes long 你知道 在那个特定系统上是 8 个字节。该假设不适用于不是 8 字节的系统。
  • @EugeneX 并不总是这样。该标准仅保证它至少为 32 位。
  • @EugeneX 这取决于使用的编译器。一些实现将其大小定义为 4 个字节,其他的定义为 8 个字节。
【解决方案2】:

如果 unsigned long 最大值为 4294967295,测试程序如何得出 4294967297?

鉴于前提,它不能。

但是,不能保证 unsigned long 的最大值正好是 4'294'967'295,所以你的前提可能是无效的。该最大值对应于 32 位数字可以表示的最大值。 32 是 (unsigned) long 所需的最小宽度,但它可能比这更宽。

特别是,某些 64 位系统的典型情况是 unsigned long 为 64 位,最大值为 18'446'744'073'709'551'615。

【讨论】:

    猜你喜欢
    • 2016-07-29
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2012-01-27
    • 1970-01-01
    • 2020-05-14
    相关资源
    最近更新 更多