15

嗯..我有点像/之类的修饰符会扩展/减少创建变量时分配的内存量,但是...

#include <stdio.h>

#define test_int int
#define long_int long int
#define long_long_int long long int

void main()
{
    printf("%i\n", sizeof (test_int)); //output 4
    printf("%i\n", sizeof (long_int)); //output 4. Why? wasn't I modified it's size?
    printf("%i\n", sizeof (long_long_int)); //output 8
}

由于未知原因,它将intlong int的大小打印为相同。我使用 vc++ 2010 速成版。抱歉,在 google 中很难找到答案,它总是将longint显示为单独的类型。

4

6 回答 6

25

MS 选择long在 64 位系统上制作 32 位的原因是现有的 Windows API,由于历史原因,混合使用intlong类似的东西,期望这是 s 32 位值(一些这可以追溯到 Windows 是 16 位系统的时代)。所以为了将旧代码转换为新的 64 位架构,他们选择保持long在 32 位,这样混合intlong不同地方的应用程序仍然可以编译。

C++ 标准中没有规定 along应该大于int(在大多数 32 位系统上肯定不是)。所有标准都说short<= int<= long-的大小short,如果内存服务[不一定表示为“应该至少为 16 位”,我认为它提到了值的范围]。

于 2013-08-21T09:10:02.840 回答
10

该标准所要求的只是:

sizeof(char) == 1

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

(并且相应的无符号类型与有符号类型具有相同的大小)。

此外,每种类型都有最小大小,通过对 值的限制等间接指定INT_MAX:achar 必须至少为 8 位,ashortint16,a long32 和long long64。

short在 16 位平台上,两者通常都是int16 位;在 32 位平台(以及仍然存在的 36 和 48 位平台)上,int并且long几乎总是相同的大小。在现代 64 位平台(使用字节寻址)上,合理的解决方案是使所有四种类型具有不同的大小(尽管有人可能会争辩说,根据标准, int应该是 64 位,这意味着int,long并且long long都具有相同的尺寸)。

于 2013-08-21T09:20:56.517 回答
2

C 和 C++ 实现,long 大于或等于 int。当今最流行的桌面平台,例如 Windows 和 Linux,主要在 32 位处理器上运行,并且这些平台的大多数编译器都使用 32 位 int,其大小和表示形式与 long 相同。

于 2013-08-21T09:10:14.280 回答
0

关键是您误解了 int 和 long 的含义(那不是形容词)。

标准定义的是每种类型的位数要求这种关系保持不变:

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long).

int,就其本身而言,可以长达short长达 长达 1long取决于实现的构思方式。

编译器设计者倾向于最大化int算术性能,使其成为底层处理器或操作系统的自然大小,并相应地设置其他类型。

但是long int,since的使用int可以省略,与long定义相同。

于 2013-08-21T09:21:28.030 回答
0

在 64 位编译器中,int 和 log int 都是 4 个字节。

如果您在 Windows 中,请浏览以下链接:http: //msdn.microsoft.com/en-us/library/s3f49ktz%28v=vs.90%29.aspx

您可能会在另一个讨论中找到一些信息: 64 位 Windows 上 long 的位大小是多少?

于 2013-08-21T09:15:28.780 回答
0

这是订购

char
short (int)
int
long (int)
long long (int)

该标准要求这sizeof(char) == 1是真的。该标准还要求:int至少为 16 位。long int至少是 32 位,long long int至少是 64 位。

由于 32 位处理器成为主流,编译器通常设置int为 4 字节。为了兼容性,该扩展在 64 位系统(无论如何对于 MSVC)上不再发生。

于 2013-08-21T09:15:53.487 回答