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

C-int和long具有相同的大小和最大值,c,int,size,long-integer,sizeof,C,Int,Size,Long Integer,Sizeof,我想检查int、long及其无符号形式的数据类型的大小、最大值和最小值。我的程序的输出显示int和long具有相同的大小,max和min值,它们的无符号形式也是一样的。以下是我的程序的输出: Size of int : 4 byte, Max value : 2147483647, Min value : -2147483648 Size of long : 4 byte, Max value : 2147483647, Min value : -2147483648 Size of unsi

我想检查int、long及其无符号形式的数据类型的大小、最大值和最小值。我的程序的输出显示int和long具有相同的大小,max和min值,它们的无符号形式也是一样的。以下是我的程序的输出:

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 5.1.0 tdm64-1编译器运行该程序。

是的,这是完全正常的。具有32位int和32位长的64位指针的体系结构称为LLP64数据模型,尽管Intel CPU本身在内部使用48位指针,但Windows还是喜欢这种体系结构

64位Linux体系结构使用LP64数据模型,该模型具有32位int、64位long和64位指针


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

是的,这是完全正常的。具有32位int和32位长的64位指针的体系结构称为LLP64数据模型,尽管Intel CPU本身在内部使用48位指针,但Windows还是喜欢这种体系结构

64位Linux体系结构使用LP64数据模型,该模型具有32位int、64位long和64位指针


C标准规定int的最小范围为-32767到+32767,而long为-2147483647到+2147483647。因此,这两种方案都符合此要求。

此关系始终保持:

short int <= int <= long int.
因此,在某些情况下,int的大小可能与long相同,而在其他一些情况下,int的大小可能与short相同。但int永远不会超过long,也永远不会低于short。这就是上面的陈述


在您的情况下,int等于long。

此关系始终保持:

short int <= int <= long int.
因此,在某些情况下,int的大小可能与long相同,而在其他一些情况下,int的大小可能与short相同。但int永远不会超过long,也永远不会低于short。这就是上面的陈述


在您的例子中,int等于long。

C标准允许int和long具有相同的大小和范围。最容易解释无符号类型的规则,这些类型具有最小的最大值:每个无符号整数类型必须能够通过至少一些数字表示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)
因此,您可以看到,无符号int和无符号long具有相同范围的配置是完全允许的,只要该范围至少与无符号long的最小范围一样大。有符号类型需要与无符号类型具有相同的总体值范围,但需要进行移位,以使几乎一半的值为负数——不幸的是,这并不像无符号类型那么简单−2n−1…2n−1.− 1,因为该标准继续允许非twos补码实现,即使多年来没有人生产过这样的CPU

您可能认为long最多可以代表263个字符−1因为在大多数64位操作系统上都是这样。但64位Windows是个例外。几乎所有自称为64位的操作系统都使用LP64,其中整数类型和void*具有以下大小:

sizeof(short)     == 2
sizeof(int)       == 4
sizeof(long)      == 8
sizeof(long long) == 8
sizeof(void *)    == 8
Windows使用LLP64 ABI,具有

sizeof(short)     == 2
sizeof(int)       == 4
sizeof(long)      == 4
sizeof(long long) == 8
sizeof(void *)    == 8
这是为了向后兼容32位窗口,其中long和int大小相同;微软认为,如果他们改变long的大小,太多的现有代码将被破坏


请注意,由于太复杂的原因,最初的1989年C标准禁止使用sizeofvoid*>sizeoflong。因为他们决定在64位Windows上使用LLP64,微软强行对C99进行了修改以允许使用它,而实际上其他人都明确表示反对。然后,在C99问世后的十多年里,他们没有费心实现C99的功能,例如uintptr_èt和%zu,这些功能本应取代宽松的要求,这导致试图编写在Windows和非Windows上都能运行的程序的人累积了数年的额外工作。并不是说我很痛苦™.

C标准允许int和long具有相同的大小和范围。最容易解释无符号类型的规则,这些类型具有最小的最大值:每个无符号整数类型必须能够通过至少一些数字表示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)
因此,您可以看到,无符号int和无符号long具有相同范围的配置是完全允许的,只要该范围至少与无符号long的最小范围一样大。有符号类型需要与无符号类型具有相同的总体值范围,但需要进行移位,以使几乎一半的值为负数——不幸的是,这并不像无符号类型那么简单−2n−1…2n−1.− 1,因为该标准继续允许非- Two是对实现的补充,尽管多年来还没有人生产过这样的CPU

您可能认为long最多可以代表263个字符−1因为在大多数64位操作系统上都是这样。但64位Windows是个例外。几乎所有自称为64位的操作系统都使用LP64,其中整数类型和void*具有以下大小:

sizeof(short)     == 2
sizeof(int)       == 4
sizeof(long)      == 8
sizeof(long long) == 8
sizeof(void *)    == 8
Windows使用LLP64 ABI,具有

sizeof(short)     == 2
sizeof(int)       == 4
sizeof(long)      == 4
sizeof(long long) == 8
sizeof(void *)    == 8
这是为了向后兼容32位窗口,其中long和int大小相同;微软认为,如果他们改变long的大小,太多的现有代码将被破坏


请注意,由于太复杂的原因,最初的1989年C标准禁止使用sizeofvoid*>sizeoflong。因为他们决定在64位Windows上使用LLP64,微软强行对C99进行了修改以允许使用它,而实际上其他人都明确表示反对。然后,在C99问世后的十多年里,他们没有费心实现C99的功能,例如uintptr_èt和%zu,这些功能本应取代宽松的要求,这导致试图编写在Windows和非Windows上都能运行的程序的人累积了数年的额外工作。并不是说我很痛苦™.

来自C标准6.2.5类型

8,用于具有相同符号性和不同 整数转换等级见6.3.1.1,类型值的范围 对于较小的整数转换,秩是 另一种

所以所需要的就是int类型的值的范围不会大于long类型的值的范围

和6.3.1.1布尔值、字符和整数

1每个整数类型都有一个定义为 如下:

-long-long int的秩应大于long-long int的秩 int,应大于int的秩,应为 大于短int的秩,该秩应大于 有符号字符的秩

因此,尽管int和long类型的对象可以具有相同的表示形式和相应的相同的值范围,但是long类型的秩高于int类型的秩

例如,如果int和long类型具有相同的表示形式,则下面代码段中表达式x+y的类型将为long

不仅int和long类型可以具有相同的表示形式。例如,在64位系统上,long int和long long int类型也可以重合

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

#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;
} 

来自C标准6.2.5类型

8,用于具有相同符号性和不同 整数转换等级见6.3.1.1,类型值的范围 对于较小的整数转换,秩是 另一种

所以所需要的就是int类型的值的范围不会大于long类型的值的范围

和6.3.1.1布尔值、字符和整数

1每个整数类型都有一个定义为 如下:

-long-long int的秩应大于long-long int的秩 int,应大于int的秩,应为 大于短int的秩,该秩应大于 有符号字符的秩

因此,尽管int和long类型的对象可以具有相同的表示形式和相应的相同的值范围,但是long类型的秩高于int类型的秩

例如,如果int和long类型具有相同的表示形式,则下面代码段中表达式x+y的类型将为long

不仅int和long类型可以具有相同的表示形式。例如,在64位系统上,long int和long long int类型也可以重合

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

#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;
} 

在Linux机器上如何?这会有所不同吗?@AkhmadZaki:是的,它可以在Linux机器上运行吗?会有不同吗?@AkhmadZaki:是的,它可能倾向于说这里的限制是多少。我倾向于说这里的限制是多少。你在哪个平台上运行你的程序,因为我在Linux中从上述代码中得到了不同的答案?请参阅:格式说明符7:12:警告:格式“%d”要求参数类型为“int”,但参数3的类型为“long int”[-Wformat=]请将其更正为%ld。您有未定义的行为,您应该使用%zu打印sizeof中的大小值。我在Windows@LethalProgrammer上运行它,您是在哪个平台上运行程序的,因为我在Linux中从上面的代码中得到了不同的答案?请参阅:格式说明符7:12:警告:格式“%d”要求参数类型为“int”,但参数3的类型为“long int”[-Wformat=]将其更正为%ld。
如果您有未定义的行为,则应使用%zu打印sizeof中的大小值。我正在Windows@LethalProgrammer上运行它。例如,rangeshort上还有其他最小约束,但不能小于字符。rangeshort上还有其他最小约束,但不能小于字符,例如