为什么sizeof(int)== sizeof(long)?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么sizeof(int)== sizeof(long)?相关的知识,希望对你有一定的参考价值。

在下面列出的程序中,sizeof(int)和sizeof(long)在我的机器上是相等的(都等于4个字节(或32位))。据我所知,很长一段是8个字节。它是否正确?我有一台64位机器

#include <stdio.h>
#include <limits.h>

int main(void){
    printf("sizeof(short) = %d
", (int)sizeof(short));
    printf("sizeof(int) = %d
", (int)sizeof(int));
    printf("sizeof(long) = %d
", (int)sizeof(long));
    printf("sizeof(float) = %d
", (int)sizeof(float));
    printf("sizeof(double) = %d
", (int)sizeof(double));
    printf("sizeof(long double) = %d
", (int)sizeof(long double));
    return 0;
}
答案

据我所知,很长一段是8个字节。它是否正确?

不,这不正确。 C和C ++规范仅声明long必须大于或等于32位。 int可以更小,但在许多平台上,在C和C ++中,longint都是32位。

这是prefer fixed width integer types的一个非常好的理由,例如int64_t,如果它们可供你使用,而你正在使用C99或一个为你提供同等类型的框架。

另一答案

这取决于你的ABI。如果您使用的是Windows,Microsoft选择了LLP64模型,因此longint都是32位,而long long和指针在64位版本中是64位,原因很遗憾。

大多数UNIX平台选择了一个LP64模型,它为32位构建生成int 32位,longlong long和64位指针。

但是,正如Reed Copsey所说,标准只规定了最小长度和相对长度。并且long必须大于或等于int的长度。

另一答案

C不是Java也不是C#。正如其他人所写,C规范规定了最小长度和相对长度。为什么? C被设计为低级别,几乎可以在任何硬件上编译和运行。

如果一个规范向程序员承诺太多,那么当硬件不支持这样的事情时,它的实现会变得棘手(而且很慢)。 Java和C#开发人员并不太在意,他们喜欢将语言的便利性用于更高级别的工作,并且毫不犹豫地安装大型虚拟机来完成所有承诺(或至少大部分的承诺)。

C程序员希望即使在机器指令级别上也能控制代码。完全控制硬件。只有这样才能使用所有硬件功能,并达到最高性能。但是你必须小心你对你正在使用的硬件的假设。一如既往,强大的力量带来了巨大的责任。

只是为了说明:C不假设8位字节。请参阅CHAR_BIT中的<limits.h>

一个相关的问题是Size of an integer in C

另一答案

不,该标准定义了long4 bytesint2 bytes的最小值。根据C99 draft standard部分5.2.4.2.1整数类型的大小第1段说:

[......]其实施定义的数值应等于或大于[...]

而对于long,我们有:

 LONG_MIN -2147483647 // -(2^31 - 1)
 LONG_MAX +2147483647 // 2^31 - 1     

这是4 bytes。为了完整起见,我们为int提供以下内容:

 INT_MIN -32767 // -(2^15 - 1)
 INT_MAX +32767 // 2^15 - 1

这是2 bytes

以上是关于为什么sizeof(int)== sizeof(long)?的主要内容,如果未能解决你的问题,请参考以下文章

为啥“memset(arr, -1, sizeof(arr)/sizeof(int))”不能将整数数组清除为-1?

使用 Malloc,sizeof(int) * numRows 和 sizeof(int * [numRows]) 之间的区别

sizeof(long) == sizeof(void*) 吗?

sizeof 数组名字,数组指针

C语言中“SIZEOF(INT)“是啥意思?有啥作用?

动态规划之最长公共子序列