整型数据类型及其取值范围详解
整型数据类型
C数据类型 | 最小值 | 最大值 |
---|---|---|
[signed] char | -128 | 127 |
unsigned char | 0 | 255 |
short | -32768 | 32767 |
unsigned short | 0 | 65535 |
int | -2 147 483 648 | 2 147 483 647 |
unsigned | 0 | 4 294 967 295 |
long | -2 147 483 648 | 2 147 483 647 |
unsigned long | 0 | 4 294 967 295 |
int32_t | -2 147 483 648 | 2 147 483 647 |
uin32_t | 0 | 4 294 967 295 |
int64_t | -9 223 372 036 854 775 808 | 9 223 372 036 854 775 807 |
uint64_t | 0 | 18 446 744 073 709 551 615 |
32位程序上C语言整型数据类型的典型取值范围
C数据类型 | 最小值 | 最大值 |
---|---|---|
[signed] char | -128 | 127 |
unsigned char | 0 | 255 |
short | -32768 | 32767 |
unsigned short | 0 | 65535 |
int | -2 147 483 648 | 2 147 483 647 |
unsigned | 0 | 4 294 967 295 |
long | -9 223 372 036 854 775 808 | 9 223 372 036 854 775 807 |
unsigned long | 0 | 18 446 744 073 709 551 615 |
int32_t | -2 147 483 648 | 2 147 483 647 |
uin32_t | 0 | 4 294 967 295 |
int64_t | -9 223 372 036 854 775 808 | 9 223 372 036 854 775 807 |
uint64_t | 0 | 18 446 744 073 709 551 615 |
64位程序上C语言整型数据类型的典型取值范围
图中的注意事项:
取值范围不是对称的———负数的范围比整数的范围大1.当我们考虑如何表示负数的时候,会看到为什么会是这样子。
C数据类型 | 最小值 | 最大值 |
---|---|---|
[signed] char | -127 | 127 |
unsigned char | 0 | 255 |
short | -32767 | 32767 |
unsigned short | 0 | 65535 |
int | -32767 | 32767 |
unsigned | 0 | 65535 |
long | -2 147 483 647 | 2 147 483 647 |
unsigned long | 0 | 4 294 967 295 |
int32_t | -2 147 483 648 | 2 147 483 647 |
uin32_t | 0 | 4 294 967 295 |
int64_t | -9 223 372 036 854 775 808 | 9 223 372 036 854 775 807 |
uint64_t | 0 | 18 446 744 073 709 551 615 |
C语言的整型数据类型的保证的取值范围。C语言标准要求这些数据类型必须至少具有这样的取值范围
C语言标准定义了每种数据类型必须能够表示的最小的取值范围。如上图所示,它的取值范围与32位和64位所示的典型实现一样或者小一些。特别地,除了固定大小的数据类型是例外,我们看到它们只要求正数和负数的取值范围是对称的。此外,数据类型
int
可以用2个字节的数字来实现。这几乎退到了16位机器的时代。还可以看到,long
的大小可以用4个字节的数字来实现,对32位程序来说这是很典型的。固定大小的数据类型保证数值的范围与32位程序上C语言整型数据类型的典型取值范围一致。包括负数与正数的不对称性。
C语言支持多种整型数据类型——表示有限范围的整数。如图所示,其中给出了“典型”32位和64位机器的取值范围。每种类型都能用关键字来指定大小,这些关键字包括,同时还可以指示被表示的数字是非负数(声明为),或者可能是负数(默认即可)。为这些不同的大小分配的字节数可根据程序编译为32位gcc -m32 prog.c
或者64位gcc -m64 prog.c
而有所不同。根据字节分配,不同的大小所能表示的值的范围是不同的。特别注意,这里给出来的唯一一个与机器有关的取值范围是大小指示符long
的。大多数64位的机器使用8个字节的表示。比32位机器上使用的4个字节的表示的取值范围大的多
补充:字数据大小
每台计算机都有一个字长(word size),指明指针数据的标称大小(nominal size)。
因为虚拟地址是以这样的一个字来编码的,所以字长决定的最重要的系统参数就是虚拟地址空间的最大大小。也就是说,对于一个字长为位的机器而言,虚拟地址的范围位,程序最多访问个字节
最近这些年,出现了大规模的从32位字长机器到64位字长机器的迁移。这种情况首先出现在为大型科学和数据库应用设计的高端机器上,之后是台式机和笔记本电脑,最近则出现在智能手机的处理器上。32位字长限制虚拟地址空间为4千兆字节(写作4GB),也就是说,刚刚超过个字节。扩展到64位字长使得虚拟地址空间为16EB,大约是字节
基本c数据类型的典型大小(以字节为单位)。分配的字节数受如何编译的影响而变化。