long long可能不存储整数?

时间:2012-11-19 02:33:44

标签: c++

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

提前致谢!

2 个答案:

答案 0 :(得分:7)

这正是它所说的。无法保证long long可以存储的数字多于int。它至少和一样,但它可以是相同的。

  

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

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

3.9.1基本类型[basic.fundamental]

  

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

答案 1 :(得分: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),具有较小整数转换等级的类型的值范围是a 另一种类型的值的子范围。

  • 类型最大值的最小允许值(ISO / IEC 9899:2011,§5.2.4.2.1整数类型的大小<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)(并且由于引用的不等式sizeof(int) == 4)。在大多数Unix 64位系统上,sizeof(long) == 8sizeof(long long) == 8sizeof(long) == 4;在Windows 64上,long long且只有__int64(或{{1}})是64位类型。