为什么“long int”和“int”有相同的大小?这个修饰符是否起作用?

19

嗯...我有点认为像long / short这样的修饰符在创建变量时会扩展/减少分配的内存量,但是...

#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 express版。 很抱歉,在谷歌上难以找到答案,它总是将longint作为单独的类型显示。


2
为什么大小不应该相同?!类型是不同的,这才是最重要的。每种类型可以表示由标准规定的一组值,但它可以自由地表示更多的值。 - Kerrek SB
1
那么 long 修饰符有什么作用呢?它不应该扩展分配的内存量吗? - Kosmo零
1
据我所知,标准只规定 long 至少与 integer 一样长。它不能更短,但不必超过 int。其他所有内容都取决于机器。 - zubergu
5
这个答案提供了可表示值的强制范围(点击此处查看)。值得注意的是:short 至少为16位,long int 至少为32位,long long int 至少为64位。其他所有类型都未指定大小。例如,一个平台完全可以将每种类型的长度设为256位,因此每种类型的 sizeof 都将为1。 - Kerrek SB
2
实际上,整个网站都很糟糕。我在打开的每一页上都发现了一个或两个严重的错误。 - James Kanze
显示剩余4条评论
6个回答

28
MS选择即使在64位系统上也将long设定为32位的原因是,现有的Windows API基于历史原因在类似的事情中使用了intlong的混合,并且预期这是一个32位值(其中一些可以追溯到Windows 16位系统时代)。因此,为了将旧代码转换为新的64位架构,他们选择保持long为32位,以便在不同位置混合intlong的应用仍然可以编译。
C++标准中没有规定long必须比int大(在大多数32位系统上确实不是)。标准所说的就是short <= int <= long的大小关系 - 如果我没记错的话,short至少为16位[不一定表示"应该至少为16位",我想它提到了值的范围]。

实际上,它提到short应该至少保持在-32767到+32767之间。请注意,标准没有强制规定-32768(2的补码中16位数字的最低值),因为它没有指定如何处理负数。 - Medinoc
非常感谢Mats,但似乎long在过去30年中一直被用作int的另一个别名!如果它不会比那更大,为什么要在标准中提及它呢!在主要编译器和系统中没有一次提供比int更多空间的情况下,拥有称为long的东西而不提供更多空间是毫无意义的!这太荒谬了,所有新语言都具有有意义的语义,C++似乎在每件事上都是例外! - Hossein
1
@Hossein:30年前,许多编译器将int作为16位值,而long则为32位。如今,在具有64位处理器的非Windows平台上,long确实是64位,而int是32位。但主要问题在于,并没有保证long类型的大小是任何特定值,除了最小的32位。然后取决于编译器是否比这更大。 - Mats Petersson
1
@Hossein C和C++在许多不同的系统上都有应用,有许多非Windows系统,其中long为64位。有些系统中int为16位,而long为32位。 - nos
哇,嗯,那个地狱实际上只适用于Windows。至少在macOS上,long类型的长度符合预期,为8个字节。 - Atombit

13

标准所要求的只是:

sizeof(char) == 1

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

此外,每种类型都有最小的大小限制,间接地由INT_MAX等值的限制来指定:一个char 必须至少8位,一个short 和一个int必须为16位,long必须为32位,long long必须为64位。同时,无符号类型的大小应与相应的带符号类型相同。

在16位平台上,通常shortint都是16位;在32位平台(以及仍存在的36位和48位平台)上,intlong几乎总是相同大小。在现代64位平台上(字节寻址),合理的解决方案是使这四种类型具有不同的大小(尽管可以认为根据标准,int应该是64位,这意味着intlonglong long都具有相同的大小)。


2

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


3
这是不正确的,long 是“与 int 一样大或更大”。没有要求更大。 - Mats Petersson
@MatsPetersson sizeof (int) <= sizeof(long)。在32位系统中它们相等,但在64位系统中则不同。 - Dayal rai
1
在64位系统上可能会有所不同。例如,在Windows机器上就不是这样的。 - Mats Petersson

0

在大多数64位编译器中,int是4个字节,而long是8个字节。 - James Kanze

0

问题在于您误解了int和long的含义(这不是形容词)。

标准定义的是每种类型中的位数需要保持以下关系:

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

int本身可以像short一样短,也可以像long一样长,这取决于实现的方式。

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

但是使用long int时,由于可以省略int,因此根据定义,它与long完全相同。


sizeof(long)== sizeof(long long)在64位平台上除Windows外是可能的,也很常见。 - Potatoswatter

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而言)不再进行扩展。


或许这就是为什么我认为 long int 应该比 int 更大的原因。当我学习 C++ 时,我从 Borland C++ 3.1 开始。 - Kosmo零
C语言还要求int类型至少为16位,long类型至少为32位。 - Potatoswatter
我不确定你能说int曾经“通常”是16位。当16位的int很普遍时,机器差异很大,可能有同样多的机器拥有32位的int(至少有几台拥有36位int或其他今天被认为是奇特的变体)。 - James Kanze
除了MSVC之外,64位系统的long类型占用8个字节。 - James Kanze
“除了MSVC”是一个误称。首先,如果我没记错的话,MinGW也适用于同样的情况;其次,我怀疑Win64不是唯一的LLP64long long和指针64位)平台。 - Medinoc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接