c ++ long int与int相同?

时间:2017-01-22 07:35:56

标签: c++ eclipse mingw

我刚刚开始学习如何编码(比如3天前)我有一些问题......首先,我的“int”,“long int”和“unsigned int”所有看起来都是一样的大小

#include <iostream>
#include <limits.h>
using namespace std;

int main() {

    int value = 2147483647;
    cout << value << endl;

    cout << "Max int value: "<< INT_MAX << endl;
    cout << "Min int value: "<< INT_MIN << endl;
    long lvalue = 568534534;
    cout << lvalue << endl;

    short svalue = 22344;
    cout << svalue << endl;

    cout << "Size of int " << sizeof(int) << endl;
    cout << "Size of short int: " << sizeof(short) << endl;
    cout << "Size of long int: " << sizeof(long) << endl;
    cout << "Size of unsigned int: " << sizeof(unsigned int) << endl;
    unsigned int uvalue = 5345554;
    cout << uvalue << endl;
return 0;   
}

当我运行它时,我明白了:

568534534
22344
Size of int 4
Size of short int: 2
Size of long int: 4
Size of unsigned int: 4
5345554

如你所见。 Long,unsigned int = int。

这不是我唯一的问题。对于“长双”,无论数量多大,它总是输出负数。 这是代码:

#include <iostream>
#include <iomanip>

using namespace std;

int main() {

    float fvalue = 123.456789;

    cout << sizeof(float) << endl;
    cout << setprecision(20) << fixed << fvalue << endl;

    double dvalue = 234.5554;
    cout << setprecision(20) << fixed << dvalue << endl;

    long double lvalue = 123.4;
    cout << setprecision(20) << fixed << lvalue << endl;
    return 0;
}

结果如下:

4
123.45678710937500000000
234.55539999999999000000
-18137553330312606000000000000000000000000000000000000

(删除了大部分的零btw)

所以,你可以看到某些东西存在问题。 我使用eclipse作为我的IDLE和 我用的是MinGW32 虽然我使用的是64位系统,但我尝试为我的系统安装MinGW-w64,但却无法找到...

1 个答案:

答案 0 :(得分:3)

对于基本整数类型(例如intlong intunsignedunsigned shortunsigned long),C ++标准明确规定了每种类型可以使用的值代表,而不是大小。注意:这不适用于从99和C ++(2011年)引入C的“固定宽度”类型。

实际上,int必须能够支持(至少)-3276732767范围内的所有值。 short int(又名short)的要求是相同的。 long int的要求相当于支持-21474836472147483647范围的要求。

然而,重要的是,这些是最低要求 - 允许所有这些类型支持更大范围的值。但是,这些类型的大小是实现定义的。

实际上,假设二进制表示,intshort的要求转换为需要16位或更多,包括符号位,相当于两个8 - 位字节,对于long,要求转换为32位或更多,或四位8位字节。

请注意,大多数现代编译器都使用二进制表示(因为现代目标体系结构是数字的)。但是,C ++标准实际上并不需要这样做 - 它只是说明了所需的范围(如这里的情况,对于整数类型)或行为限制。

但是,允许每个整数类型表示更大范围的值(即超过标准所声明的最小要求),因此没有什么能阻止实现(编译器)使short16 {1}}位,int32位,long32位。当然,依赖于此类值的代码无法保证与其他实现一起使用 - 例如,具有16 - 位short16 - 位int的代码,以及32 - 位long

对于unsigned类型,可以进行相同类型的讨论,但范围不同。但是,实际上,unsigned short可以使用16位或更多位来表示,unsigned int也可以是16位或更多,unsigned long来自32 {1}}位或更多。

至于你关于long double的问题 - 一些免费提供的实现在他们对long double的支持中存在错误,这些错误会导致你描述的输出。从内存中,例如,某些版本的gnu编译器的MingW端口 - 很可能随Eclipse一起提供。检查编译器是否有更新。

附注:我已经看到声称最近的C和C ++标准要求sizeof char <= sizeof short <= sizeof int <= sizeof long <= sizeof long long之类的关系 - 不同于这些类型需要的范围的副作用能够代表。我还看到一些声称建议最近的标准设置了用于表示整数类型的位数的要求。我没有证实这些说法(没有理由,因为我从来没有写过依赖这种关系的代码)。如果我知道这些说法确实如此,我会更新上面的讨论。