我想检查数据类型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)
编译器运行程序。
答案 0 :(得分:5)
这种关系始终存在:
short int <= int <= long int.
因此,在某些情况下,int
可能与long
具有相同的大小,而在其他一些情况下,int
的大小可能为short
。但int
永远不会超过long
,永远不会超过short
。这就是上述陈述(不平等)所说的。
在您的情况下,int
等于long
。
答案 1 :(得分:3)
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)
因此,您可以看到完全允许unsigned int
和unsigned 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的等级,大于等于 签名字符的排名。
因此虽然int
和long
类型的对象可以具有相同的表示形式,但相应的值范围相同但类型long
的等级高于等级int
的等级。输入int
。
例如,如果类型long
和x + y
具有相同的表示形式,则下面的代码段中的表达式long
的类型将为int x = 0;
long y = 0;
printf( "%ld\n", x + Y );
。
int
long
和long 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}}