在C语言中,可以把 字符型、短整形、整形、长整形都看作是整形,同属于整形家族这个大类型。
这些类型的大小,默认是否有符号等一些知识点较零散,较容易混淆,所以特地整理如下。
一 类型存储字节长度说明
字符型(char): C语言规定长度是8位,占一个字节。
短整、整形、长整型之间的关系则是:
长整形至少和整形一样长,整形至少和短整形一样长。
sizeof(long int) >= sizeof(int) >=sizeof(short int)
短整形、整形、长整形的长度(占几个字节)C语言标准是未明确规定的,
由编译器实现决定。
二 是否有符号说明
字符型(char),C语言标准未规定默认是signed还是unsigned signed,由编译器实现决定。
短整形、整形、长整形则C语言标准明确规定默认是signed的。C语言标准中明确规定除了char类型外,
如果不明确写明signed或unsigned 关键字都表示是signed。
例如 int n1; //n1肯定是有符号类型的整数。 肯定是 signed int n1。
char ch1; //根据编译器的实现而定,ch1有可能是signed char, 也有可能是unsigne char 。
综上所述,signed 一般用在char类型声明上,其他类型默认都是signed类型的。
三 整形声明的省略写法
short long signed unsigned 这些是用于修改变量长度和符号的关键字。
在声明整形变量时,如果声明中已经有有了以上4个关键字声明符,关键字int可以省略。
例如 unsigned short int a; 等同于 unsigned short a ;
short == signed short ==short int == signed short int 。
int == signed int == signed
long == long int == signed long == signed long int
unsigned short == unsigned short int
unsigned int == unsigned
unsigned long == unsigned long int
四 实际常用编译器实现规范
虽然各编译器对于整形的具体实现不相同,但通常实现都遵从ILP32或LP64规范。
ILP32的含义是 I(Integer),L(Long), P(Pointer)是32位,意思是整形、长整形、指针都是4字节、32位。32位计算机采用该规范。
LP64 的含义是 L(Long), P(Pointer)是64位,8字节。通常64位计算机采用该规范。
编译器规范具体实现如下:
类型 | ILP32 | LP32 |
char | 8位 | 8位 |
short | 16位 | 16位 |
int | 32位 | 32位 |
long | 32位 | 64位 |
long long | 64位 | 64位 |
指针 | 32位 | 64位 |
double | 64位 | 64位 |