C语言中long int和int的大小均为4个字节。

3
我是一名有用的助手,可以为您翻译文本。
我做了以下实验来了解我的系统中long int和int的大小。
系统规格: 64位Windows 7 GCC MinGW编译器 Eclipse CDT
我对程序的输出感到困惑。如果任何人对此有任何想法,请分享并帮助我。
程序:
#include<stdio.h>
#include<conio.h>
int main(){

    unsigned long int b;
    unsigned  int a;

    printf("%d",sizeof(b));
    printf("\n");
    printf("%d",sizeof(a));

 }

输出:

4

4

在线GCC编译器版本4.8.1对于相同的程序给出了不同的输出。

8

4

在此输入图片描述


打印 size_t 类型的值的正确方式是 %zu,这是 C99 标准中的方法。在早期版本中,可以使用 %lu 并将其转换为 (unsigned long)%d 适用于带符号的 int 类型,而 size_t 不是带符号类型。 - unwind
如果您需要64位,请使用unsigned long long int b; - user3386109
1
MinGW是一个32位编译器,因此大小符合32位Windows。 - phuclv
@Lưu Vĩnh Phúc,但是为什么大小相同呢?这就是我的问题。当有int可以存储4个字节的数据时,long int有什么用处呢? - Vishwanath gowda k
因为编译器可以具有不同的类型大小,只要符合标准即可。GCC来自nix,因此long和long int都是64位的,就像在nix操作系统中普遍使用的一样。 - phuclv
C标准并不禁止它们相等。例如,在16位x86中,short和int都是16位,为什么short必须比int短呢? - phuclv
2个回答

3
根据数据类型大小的文档,你的结果是正确的。
在64位Windows系统中,long int(有符号和无符号)和int(有符号和无符号)都是32位,因此它们显示为4个字节。

我接受这个,但为什么它们是相同的..那么长整型有什么用呢.. - Vishwanath gowda k
1
@Vishwanathgowdak 它们并不总是相同的。根据那个表格,在一个16位的Windows设置或64位的类Unix系统(Linux,Unix,Mac等)中,这些类型的大小将会有所不同。 - cf-
它们并不总是相同的...那么它们有什么区别呢?如果在32位编译器、64位操作系统中 int 和 long int 的大小相同,那么我们为什么需要 long int 呢?它是否有特殊用途。 - Vishwanath gowda k
请参阅此论文,了解Unix操作系统开发人员为什么认为LP64数据模型优于LLP64的完整解释。简要概述是,为了与32位系统的大小/对齐兼容性而将int保留为32位,但是考虑到指针/寻址原因,64位的long比32位的long更自然。该论文还指出,LLP64模型被迫定义long long,这是一种非标准(直到C++11)的64位大小。 - cf-

3
规格说明中说:sizeof(int) <= sizeof(long),但long至少为32位,int至少为16位。前缀singnedunsigned对它们所需的空间没有影响。
如果您想使用指定的位宽,我建议使用int32_tuint64_t等类型。
参考链接:http://www.cplusplus.com/doc/tutorial/variables/

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