【问题标题】:c++ long int the same as int?c++ long int 和 int 一样吗?
【发布时间】:2017-06-06 21:47:05
【问题描述】:

我刚刚开始学习如何编码(就像 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

如您所见。长且无符号的 int = int。

这不是我唯一的问题。使用“long double”,无论数字有多大,它总是输出负数。 代码如下:

#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

(顺便说一句,删除了大部分零)

所以,正如您所见,有些东西存在问题。 我使用 eclipse 作为我的 IDLE 和 我使用 MinGW32 虽然我在 64 位系统上,但我尝试为我的系统安装 MinGW-w64,但找不到如何...

【问题讨论】:

  • C++ 将整数类型的大小留给了实现者Give this a read。请注意,C++ 标准仅指定整数类型至少为 X 位。您所有的整数类型都可以是 64 位。
  • 你真的应该一次问一个问题。
  • 请注意,在 C++ 中,您可以使用 std::numeric_limits 代替像 INT_MAX 这样的 C 宏。

标签: c++ eclipse mingw


【解决方案1】:

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

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

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

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

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

但是,每个整数类型都可以表示更大范围的值(即超过标准规定的最低要求),因此没有什么可以阻止实现(编译器)拥有short16位,int32 位,long 也是 32 位。自然,不保证依赖于这些值的代码可以与其他实现一起使用 - 例如,具有16-bit short16-bit int32-bit @987654352 的代码@。

unsigned 类型可以进行相同类型的讨论,只是范围不同。然而,实际上,unsigned short 可以使用16 位或更多位来表示,unsigned int 也可以是16 位或更多位,而unsigned long 可以使用32 位或更多位来表示。

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

旁注:我已经看到最近的 C 和 C++ 标准要求诸如 sizeof char &lt;= sizeof short &lt;= sizeof int &lt;= sizeof long &lt;= sizeof long long 之类的关系——这与这些类型所要求的范围的副作用不同能够代表。我还看到一些声明表明最近的标准对用于表示整数类型的位数设置了要求。我没有证实这些说法(没有理由,因为我从不编写依赖于这种关系的代码)。如果我知道这些说法是真的,我会更新上面的讨论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多