【问题标题】:Why do the max values of long and long long produce the same output?为什么 long 和 long long 的最大值会产生相同的输出?
【发布时间】:2017-09-01 03:47:47
【问题描述】:
#include <iostream>
using namespace std;
#include <climits>

int main () {

    int n_int = INT_MAX;
    short n_short = SHRT_MAX;
    long n_long = LONG_MAX;
    long long n_llong = LLONG_MAX;

    cout << "int is " << sizeof (int) << " bytes." << endl;
    cout << "short is " << sizeof n_short << " bytes." << endl;
    cout << "long is " << sizeof n_long << " bytes." << endl;
    cout << "long long is " << sizeof n_llong << " bytes." << endl;
    cout << endl;

    cout << "Maximum values:" << endl;
    cout << "int:   " << n_int << endl;
    cout << "short: " << n_short << endl;
    cout << "long:  " << n_long << endl;
    cout << "llong: " << n_llong << endl << endl;
    //cout << endl;

    cout << "Minimum int value = " << INT_MIN << endl;
    cout << "Maximum int value = " << INT_MAX << endl;
    cout << "Bits per byte = " << CHAR_BIT << endl;

    return 0;
}

输出: long 和 long long 变量产生完全相同的最大值,我不知道为什么。 long值应该输出最大值2147483647。

int is 4 bytes.
short is 2 bytes.
long is 8 bytes.
long long is 8 bytes.
Maximum values:
int:   2147483647
short: 32767
long:  9223372036854775807
llong: 9223372036854775807
Minimum int value = -2147483648
Maximum int value = 2147483647
Bits per byte = 8

【问题讨论】:

    标签: c++ c++11 visual-c++ c++14 c++builder


    【解决方案1】:

    long 不保证为 32 位长;它只需要至少 32 位长。您的实现已将 long 定义为 64 位。请注意,即使 longlong long 在您的实现中具有相同的范围,它们仍然是不同的类型。

    【讨论】:

    • Long 不需要至少为 32 位。唯一具有保证大小的内置类型是 char,并且 sizeof(char) 将始终为 1。这并不意味着 1 个字节。这意味着 1 个单位(该机器上的任何字符)。唯一的保证是 long 至少与 int 一样大,long long 至少与 long 一样大。
    • @ChrisUzdavinis 对不起,你错了。 C 标准规定LONG_MAX 必须至少为 2147483647,LONG_MIN 最多必须为 -2147483647。此要求通过引用并入 C++ 标准。这意味着long 至少为 32 位。
    • 既然我们在这里谈论 C++,我是对的。从 C++ 标准 8.3.3 开始:“sizeof(signed char) 和 sizeof(unsigned char) 为 1。sizeof 应用于任何其他基本类型 (6.9.1) 的结果是实现定义的。”此外,从 21.3.5 开始:“头文件 定义了与 C 标准库头文件 相同的所有宏。[注意: 中的宏定义的常量类型不需要匹配宏引用的类型。"
    • @ChrisUzdavinis sizeof 的结果是实现定义的这一事实并不能取消 long 必须能够表示从 -2147483647 到 +2147483647 的每个值的要求。从数学上讲,这意味着它至少有 32 位长。您引用的注释完全无关紧要。
    • [basic.fundamental]/3。这是 C++ 核心语言中通过引用明确纳入 C 标准的少数几个地方之一。
    猜你喜欢
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2019-12-12
    • 2015-01-07
    相关资源
    最近更新 更多