C - int和long具有相同的大小和最大值

时间:2018-03-16 12:26:31

标签: c int size long-integer sizeof

我想检查数据类型int,long及其无符号形式的大小,最大值和最小值。我的程序的输出显示int和long都具有相同的大小,最大值和最小值,同样是无符号形式。这是我的程序的输出:

Size of int : 4 byte, Max value : 2147483647, Min value : -2147483648
Size of long : 4 byte, Max value : 2147483647, Min value : -2147483648

Size of unsigned int : 4 byte, Max value : 4294967295, Min value : 0
Size of unsigned long : 4 byte, Max value : 4294967295, Min value : 0

这是我的代码:

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

int main(int argc, char *argv[])
{
    printf("Size of int : %ld byte, Max value : %d, Min value : %d\n", sizeof(int), INT_MAX, INT_MIN);
    printf("Size of long : %ld byte, Max value : %d, Min value : %d\n", sizeof(long), LONG_MAX, LONG_MIN);
    printf("\n");
    printf("Size of unsigned int : %ld byte, Max value : %u, Min value : %d\n", sizeof(unsigned int), UINT_MAX, 0);
    printf("Size of unsigned long : %ld byte, Max value : %lu, Min value : %d\n", sizeof(unsigned long), ULONG_MAX, 0);
    return 0;
}

我的问题是,这是正常的,int和long有相同的大小,最大值和最小值吗?我在Windows 10 64位计算机上使用gcc version 5.1.0 (tdm64-1)编译器运行程序。

4 个答案:

答案 0 :(得分:5)

这种关系始终存在:

short int <= int <= long int.

因此,在某些情况下,int可能与long具有相同的大小,而在其他一些情况下,int的大小可能为short。但int永远不会超过long,永远不会超过short。这就是上述陈述(不平等)所说的。

在您的情况下,int等于long

答案 1 :(得分:3)

C标准允许intlong具有相同的大小和范围。最简单的解释无符号类型的规则,其中最小最大值:每个无符号整数类型必须能够表示0到至少某个数字。这是表格:

type                             minimum maximum
unsigned char                                255   (2**8  - 1)
unsigned short                            65,535   (2**16 - 1)
unsigned int                              65,535   (2**16 - 1)
unsigned long                      4,294,967,295   (2**32 - 1)
unsigned long long    18,446,744,073,709,551,615   (2**64 - 1)

因此,您可以看到完全允许unsigned intunsigned long具有相同范围的配置,只要该范围至少与{{1}的最小范围一样大}。 签名的类型需要具有与其无符号对应项相同的整体值范围,但需要移位以便几乎正好一半的值为负值 - 不幸的是,它并不像“-2 n-1 ... 2 n-1 - 1”,因为标准继续允许非二进制补码实现,即使没有人制造出一个CPU多年来。

您可能认为unsigned long最多可以代表2 63 - 1,因为在大多数“64位”操作系统上都是如此。但“64位”Windows是一个例外。几乎所有称为“64位”的操作系统都使用所谓的“LP64 ABI”,其中整数类型和long具有这些大小:

void *

Windows使用“LLP64”ABI,

sizeof(short)     == 2
sizeof(int)       == 4
sizeof(long)      == 8
sizeof(long long) == 8
sizeof(void *)    == 8

这是为了向后兼容32位Windows,其中sizeof(short) == 2 sizeof(int) == 4 sizeof(long) == 4 sizeof(long long) == 8 sizeof(void *) == 8 long的大小也相同;微软认为,如果改变int的大小,过多的现有代码就会中断。

(请注意,由于原因太复杂而无法进入此处,原始的1989 C标准禁止使用long。因为他们决定将LLP64用于64位Windows,所以微软抨击了C99的变化允许它,实际上是其他所有人的明确反对意见。然后,在C99问世后的十多年里,他们并没有打算实施C99功能(例如sizeof(void*) > sizeof(long)uintptr_t)替代轻松的要求,导致人们在尝试编写适用于Windows和非Windows的程序时累积多年的额外工作量。并非我是Bitter™。)

答案 2 :(得分:1)

是的,这是完全正常的。具有32位int和32位long,64位指针的体系结构称为 LLP64数据模型,并且受Windows青睐(尽管Intel CPU本身在内部使用48位指针。

(64位Linux体系结构使用 LP64数据模型,它具有32位int,64位long和64位指针。)

C标准规定int最小范围是-32767到+32767,而long -2147483647到+2147483647。所以这两种方案都符合这一点。

答案 3 :(得分:0)

来自C标准(6.2.5类型)

  

8对于具有相同签名和不同的任何两个整数类型   整数转换等级(见6.3.1.1),类型的值范围   具有较小整数转换等级是值的子范围   另一种

因此,所需要的只是int类型的值范围不会超过long类型的值范围。

和(6.3.1.1布尔,字符和整数)

  

1每个整数类型都有一个定义为的整数转换等级   如下:

     

- long long int的等级应大于long的等级   int,应大于int的等级,其应为   大于短int的等级,大于等于   签名字符的排名。

因此虽然intlong类型的对象可以具有相同的表示形式,但相应的值范围相同但类型long的等级高于等级int的等级。输入int

例如,如果类型longx + y具有相同的表示形式,则下面的代码段中的表达式long的类型将为int x = 0; long y = 0; printf( "%ld\n", x + Y );

int

longlong int类型不仅可以具有相同的表示形式。例如,在64位系统上,类型long long int#include <stdio.h> int main(void) { printf( "sizeof( long int ) = %zu\n", sizeof( long int ) ); printf( "sizeof( long long int ) = %zu\n", sizeof( long long int ) ); return 0; } 也可以重合。

例如,此程序的输出在www.ideone.com上运行

sizeof( long int ) = 8
sizeof( long long int ) = 8

{{1}}