4

在我的作业中,它说“不要添加 long int 或 long long 私有成员来完成此操作,因为不能保证两者都可以实际存储比 int 更大的数字。” 我知道 int 的最大值为 2^31-1,long long 的最大值为 2^63-1。那么有人可以给我一个例子,为什么给定的句子是真的?

提前致谢!

4

2 回答 2

7

它的意思正是它所说的。不能保证 along long可以存储比 a 更多的数字int。它至少一样大,但它可以是一样的。

我知道 int 的最大值为 2^31-1 而 long long 的最大值为 2^63-1

对于某些平台,使用某些编译器,这可能是正确的,但并不总是相同的。C++ 也不保证。

3.9.1 基本类型[basic.fundamental]

2) 有五种标准有符号整数类型:“<code>signed char”、“<code>short int”、“<code>int”、“<code>long int”和“<code>long long int” . 在此列表中, 每种类型提供的存储空间至少与列表中它前面的类型一样多。[...](强调我的)

于 2012-11-19T02:35:08.917 回答
2

C 标准规定了两个相关标准:

  • sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long) ≤ sizeof(uintmax_t)

    这在 ISU/IEC 9899:2011,§6.2.5 类型,¶8 中间接指定:对于具有相同符号和不同整数转换等级的任何两个整数类型(参见 6.3.1.1),类型的值范围为较小的整数转换等级是其他类型值的子范围。

  • 类型最大值的最小允许值(ISO/IEC 9899:2011, §5.2.4.2.1 Sizes of integer types <limits.h>):

    • SCHAR_MAX≥ 127 // 2 7 -1
    • SHRT_MAX≥ 32,767 // 2 15 -1
    • INT_MAX≥ 32,767 // 2 15 -1
    • LONG_MAX≥ 2,147,483,647 // 2 31 -1
    • LLONG_MAX≥ 9,223,372,036,854,775,807 // 2 63 -1

报价在形式上是正确的;可以设计long存储范围不大于的系统int——事实上,大多数 32 位系统(我所知道的所有系统)都是这种情况,在 Windows 64 上也是如此。它不太可能是准确的写long long; 我知道没有系统在哪里sizeof(int) == sizeof(long long)(并且,由于引用的不等式,sizeof(int) == sizeof(long))。在大多数 Unix 64 位系统上,sizeof(int) == 4sizeof(long) == 8sizeof(long long) == 8; 在 Windows 64 上,sizeof(long) == 4只有long long(或__int64) 是 64 位类型。

于 2012-11-19T03:01:28.120 回答