为什么"long int"与"int"具有相同的大小?这个修饰符是否有效?

Kos*_*mos 10 c c++ int modifier

嗯..我很喜欢这样的修饰符,如/扩展/减少创建变量时分配的内存量,但是......

#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
}
Run Code Online (Sandbox Code Playgroud)

由于未知原因,它将intlong int的大小打印为相同.我使用的是vc ++ 2010 express版.对不起,很难在谷歌找到答案,它总是显示int作为单独的类型.

Mat*_*son 17

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

C++标准中没有任何内容规定a long应该大于int(当然不是大多数32位系统).所有标准都说大小short<= int<= long- 并且short至少是16位,如果内存服务[不一定表示为"应该至少为16位",我认为它提到了值的范围].


Jam*_*nze 6

该标准要求的全部是:

sizeof(char) == 1
Run Code Online (Sandbox Code Playgroud)

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
Run Code Online (Sandbox Code Playgroud)

(并且相应的未签名类型与已签名类型具有相同的大小)。

此外,有最小的尺寸为每种类型的,由限制间接指定上的值INT_MAX等:一个char 必须是至少8位,一个shortint16,long32和long long64。

上16个的平台上,它是通常用于两个shortint为16位; 在32位平台(以及仍然存在的36和48位平台)上,int并且long几乎总是相同的大小。在现代的64个平台(以字节寻址),合理的解决办法是让所有四种类型有不同的尺寸(尽管人们可以争辩说,按照标准, int应该是64位,这将意味着intlonglong long所有有同样的尺寸)。