C-int和long具有相同的大小和最大值
我想检查int、long及其无符号形式的数据类型的大小、最大值和最小值。我的程序的输出显示int和long具有相同的大小,max和min值,它们的无符号形式也是一样的。以下是我的程序的输出: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
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上还有其他最小约束,但不能小于字符,例如