是不是不能保证long或者long long可以存储比int更大的数字呢?

问题描述 投票:0回答:2

在我的作业中,它说

请勿添加

long int
long long
私人成员来完成此操作,因为不能保证它们实际上可以存储比
int
更大的数字。

我知道

int
的最大值为 231-1,而
long long
的最大值为 263-1。有人可以举个例子来解释为什么给定的句子是正确的吗?

c++ types integer long-integer
2个回答
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
”。在这份名单中, 每种类型至少提供与其前面的类型一样多的存储空间 列表。 [...](强调我的)


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 // 27-1
    • SHRT_MAX
      ≥ 32,767 // 215-1
    • INT_MAX
      ≥ 32,767 // 215-1
    • LONG_MAX
      ≥ 2,147,483,647 // 231-1
    • LLONG_MAX
      ≥ 9,223,372,036,854,775,807 // 263-1

报价形式正确;可以设计出

long
不存储比
int
更大的范围的系统 — 事实上,大多数 32 位系统(我所知道的所有系统)都是这种情况,在 Windows 64 上也是如此。不太可能准确 w.r.t
long long
;据我所知,没有任何系统可以实现
sizeof(int) == sizeof(long long)
(并且,由于引用的不平等,
sizeof(int) == sizeof(long)
)。在大多数 Unix 64 位系统上,
sizeof(int) == 4
sizeof(long) == 8
sizeof(long long) == 8
;在 Windows 64 上,
sizeof(long) == 4
并且只有
long long
(或
__int64
)是 64 位类型。

© www.soinside.com 2019 - 2024. All rights reserved.