分类: 嵌入式
2018-10-06 10:37:39
类型名称 |
类型全称 |
类型缩写 |
类型长度 |
备注 |
char型或字符型 |
signed char/unsigned char |
|
8 |
整数的符号取决于编译器 |
短整型 |
short int |
short |
16 |
|
unsigned short int |
unsigned short |
|
||
整型 |
int |
int |
32 |
|
unsigned int |
unsigned |
|
||
长整型 |
long int |
long |
|
|
unsigned long int |
unsigned long |
|
||
超长整型 |
long long int |
long long |
64 |
C99添加的类型 |
unsigned long long int |
unsigned long long |
一、char、signed char、unsigned char的区别
原文:我以前总以为 char 代表有符号,而 unsigned char 代表无符号。现在才知道如果换做 short 或 int , 这样理解都没问题,因为c标准明确定义了。但是,唯独 char 不能这样理解,因为c标准中对此是 Impementation Defined,就是未明确定义,由具体的编译器明确定义。vc编译器、x86上的 gcc 都把 char 定义为 signed char;而 arm-linux-gcc 却把 char 定义为 unsigned char 。所以,做代码移植时,一定要明确char的类型。
ASCII码的取值范围是0~127,所以不管char型是有符号的还是无符号的,存一个ASCII码都没有问题。所以,一般来说,如果用char型存ASCII码字符,就不必明确写是signed还是unsigned;如果用char型表示8位的整数,为了可移植性就必须写明是signed还是unsigned。
小结:C标准中对char是 Impementation Defined,就是未明确定义,由具体的编译器明确定义,char是signed char,还是unsigned char。
char当字符用时,实质上存的就是一个8bit的数,这个8bit的数是没有signed和unsigned之分的(还不能理解?那么请问二进制数10100101B是正数还是负数?它就是个数,没有正负)。这个8bit的数用以表示标准的ASCII码字符(00H~7FH)和非标准的扩展ASCII码字符(80H~FFH)。(反过来理解一下,把十进制数128D分别保存到signed char和unsigned char中,用%c打印的结果一样的)就把它当一个8bit的数,用以表示标准的,而不必关心当前到底是signed还是unsigned。
char当整数用时,为了可移植性就必须写明是signed还是unsigned。
二、int、long int的区别
原文:除了char型之外,整型还包括short int(或者简写为short)、int、long int(或者简写为long)、long long int(或者简写为long long)等几种,这些类型都可以加上signed或unsigned关 键字表示有符号或无符号数。
还有一点要注意,除了char型以外的这些类型如果不明确写signed或unsigned关键字都表示signed,这一点是C标准明确规定的,不是Implementation Defined。
小结:c语言有5种无符号整形类型:signed char、short int(简写为short)、int、long int(简写为long)、long long int(简写为long long)。
三、long的长度
原文:除了char型在C标准中明确规定占一个字节之外,其它整型占几个字节都是Implementation Defined,C99标准中仅是规定了“sizeof(short) <= sizeof(int) <= sizeof(long) < sizeof(long long)”。通常的编译器实现遵守ILP32或LP64规范,如下表所示:
类型 |
ILP32(位数) |
LP64(位数) |
char |
8 |
8 |
short |
16 |
16 |
int |
32 |
32 |
long |
32 |
64 |
longlong |
64 |
64 |
指针 |
32 |
64 |
ILP32这个缩写的意思是int(I)、long(L)和指针(P)类型都占32位,通常32位计算机的C编译器采用这种规范,x86平台的gcc也是如此。LP64是指long(L)和指针占64位,通常64位计算机的C编译器采用这种规范。指针类型的长度总是和计算机的位数一致。
小结:long类型的长度和指针类型的长度,取决于编译器是32位还是64位。
四、整数后面加L、U
原文:以前我们只用到十进制的整数常量,其实在C语言中也可以用八进制和十六进制的整数常量。八进制整数常量以0开头,后面的数字只能是0~7,例如022,因此十进制的整数常量就不能以0开头了,否则无法和八进制区分。十六进制整数常量以0x或0X开头,后面的数字可以是0~9、a~f和A~F。
整数常量还可以在末尾加u或U表示“unsigned”,加l或L表示“long”,加ll或LL表示“long long”,例如0x1234U,98765ULL等。但事实上u、l、ll这几种后缀和上面讲的unsigned、long、long long关键字并不是一一对应的。这个对应关系比较复杂,准确的描述如下表所示(出自[C99]条款6.4.4.1)。整数常量的类型:
后缀 |
十进制常量 |
八进制或十六进制常量 |
无 |
int |
int |
u或U |
unsigned int |
unsigned int |
l或L |
long int |
long int |
既有u或U,又有l或L |
unsigned long int |
unsigned long int |
ll或LL |
long long int |
long long int |
既有u或U,又有ll或LL |
unsigned long long int |
unsigned long long int |
给定一个整数常量,比如1234U,那么它应该属于“u或U”这一行的“十进制常量”这一列,这个表格单元中列了三种类型unsigned int、unsigned long int、unsigned long long int,从上到下找出第一个足够长的类型可以表示1234这个数,那么它就是这个整数常量的类型,如果int是32位的那么unsigned int就可以表示。
小结:整数常量有十进制的整数常量(不能以0开头,否则无法和八进制区分)、八进制的整数常量(以0开头)、十六进制的整数常量(以0x或0X开头)。
整数常量还可以在末尾加u或U表示“unsigned”,加l或L表示“long”,加ll或LL表示“long long”。
附件:long int_tmp_.xlsx