长长整型可能无法存储整数?

5
在我的任务中,它说:“不要添加long int或long long私有成员来完成此操作,因为不能保证任何一个都可以存储比int更大的数字。” 我知道int的最大值为2^31-1,而long long的最大值为2 ^ 63-1。那么,有人能给我举个例子,说明为什么给定的句子是正确的吗?
提前致谢!

实际上是(2**32)-1(2**64)-1 - Some programmer dude
2
如果您需要大小保证,请使用在cstdint中定义的类型。这样您就不会冒险依赖于实现定义的行为,并且在阅读代码时更容易理解代码的含义。http://en.cppreference.com/w/cpp/types/integer - Reuben Morais
1
@JoachimPileborg:你的限制对于无符号整数是正确的;发帖者的限制对于有符号整数是正确的。 - Jonathan Leffler
2个回答

7
这意味着它的含义就是字面上说的。没有保证一个long long可以存储比int更多的数字。它至少和int一样大,但它可能是相同的大小。
“我知道int的最大值为2^31-1,而long long的最大值是2^63-1。”这可能对于某些平台、某些编译器是正确的,但不总是一样的。C++也不能保证这一点。

3.9.1 基本类型 [basic.fundamental]

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

但是我认为long long可以存储范围在-9,223,372,036,854,775,808到9,223,372,036,854,775,807之间的任何值。 - user44322
1
@chris,“至少”-已添加参考。 - Luchian Grigore
但是根据Luchian Grigore的说法,不能保证2^63-1可以存储在long long中。 - user44322
@user44322:在这种情况下,Luchian是错的。这是一个罕见的场合--可能要把它写在日历上或其他什么地方! - Jerry Coffin
@JerryCoffin 我不明白在哪里保证了long long int可以存储2^63-1。我同意int64_t - Luchian Grigore
显示剩余16条评论

2
C标准规定了两个相关标准:
- sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long) ≤ sizeof(uintmax_t) 这在ISU/IEC 9899:2011, §6.2.5 Types, ¶8中间接指定:“对于任何具有相同符号和不同整数转换等级(见6.3.1.1)的两种整数类型,较小整数转换等级的类型值范围是另一种类型值的子范围。”
- 类型最大值的最小允许值(ISO/IEC 9899:2011, §5.2.4.2.1 Sizes of integer types ):
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) == 4,sizeof(long) == 8,sizeof(long long) == 8;在Windows 64上,sizeof(long) == 4,只有long long(或__int64)是64位类型。

常见的组合甚至有名称,正如您在之前的回答中所知道的那样:https://dev59.com/mHRC5IYBdhLWcg3wMd5S#384672 - Mark Ransom
我确实知道这些名称;不过我决定在这里不使用它们,虽然也许那是一个错误。 - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接