Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1711712
  • 博文数量: 143
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1462
  • 用 户 组: 普通用户
  • 注册时间: 2016-08-23 11:14
文章分类

全部博文(143)

文章存档

2022年(3)

2021年(13)

2020年(21)

2019年(8)

2018年(28)

2017年(7)

2016年(63)

我的朋友

分类: 嵌入式

2018-10-06 10:37:39

参考:char、signed char、unsigned char的区别总结。

类型名称

类型全称

类型缩写

类型长度

备注

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

一、charsigned charunsigned 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,就是未明确定义,由具体的编译器明确定义,charsigned char,还是unsigned char

char当字符用时,实质上存的就是一个8bit的数,这个8bit的数是没有signedunsigned之分的(还不能理解?那么请问二进制数10100101B是正数还是负数?它就是个数,没有正负)。这个8bit的数用以表示标准的ASCII码字符(00H~7FH)和非标准的扩展ASCII码字符(80H~FFH)。(反过来理解一下,把十进制数128D分别保存到signed charunsigned char中,用%c打印的结果一样的)就把它当一个8bit的数,用以表示标准的,而不必关心当前到底是signed还是unsigned

char当整数用时,为了可移植性就必须写明是signed还是unsigned

二、intlong int的区别

原文:除了char型之外,整型还包括short int(或者简写为short)、intlong int(或者简写为long)、long long int(或者简写为long long)等几种,这些类型都可以加上signedunsigned关 键字表示有符号或无符号数。

还有一点要注意,除了char型以外的这些类型如果不明确写signedunsigned关键字都表示signed,这一点是C标准明确规定的,不是Implementation Defined

小结:c语言有5种无符号整形类型:signed charshort int(简写为short)、intlong int(简写为long)、long long int(简写为long long)。

三、long的长度

原文:除了char型在C标准中明确规定占一个字节之外,其它整型占几个字节都是Implementation DefinedC99标准中仅是规定了“sizeof(short) <= sizeof(int) <= sizeof(long) < sizeof(long long)”。通常的编译器实现遵守ILP32LP64规范,如下表所示:

类型

ILP32(位数)

LP64(位数)

char

8

8

short

16

16

int

32

32

long

32

64

longlong

64

64

指针

32

64

ILP32这个缩写的意思是intI)、longL)和指针(P)类型都占32位,通常32位计算机的C编译器采用这种规范,x86平台的gcc也是如此。LP64是指longL)和指针占64位,通常64位计算机的C编译器采用这种规范。指针类型的长度总是和计算机的位数一致。

小结:long类型的长度和指针类型的长度,取决于编译器是32位还是64位。

四、整数后面加LU

原文:以前我们只用到十进制的整数常量,其实在C语言中也可以用八进制和十六进制的整数常量。八进制整数常量以0开头,后面的数字只能是0~7,例如022,因此十进制的整数常量就不能以0开头了,否则无法和八进制区分。十六进制整数常量以0x0X开头,后面的数字可以是0~9a~fA~F

整数常量还可以在末尾加uU表示“unsigned”,加lL表示“long”,加llLL表示“long long”,例如0x1234U98765ULL等。但事实上ulll这几种后缀和上面讲的unsignedlonglong long关键字并不是一一对应的。这个对应关系比较复杂,准确的描述如下表所示(出自[C99]条款6.4.4.1)。整数常量的类型:

后缀

十进制常量

八进制或十六进制常量

int
long int
long long int

int
unsigned int
long int
unsigned long int
long long int
unsigned long long int

uU

unsigned int
unsigned long int
unsigned long long int

unsigned int
unsigned long int
unsigned long long int

lL

long int
long long int

long int
unsigned long int
long long int
unsigned long long int

既有uU,又有lL

unsigned long int
unsigned long long int

unsigned long int
unsigned long long int

llLL

long long int

long long int
unsigned long long int

既有uU,又有llLL

unsigned long long int

unsigned long long int

给定一个整数常量,比如1234U,那么它应该属于“uU”这一行的“十进制常量”这一列,这个表格单元中列了三种类型unsigned intunsigned long intunsigned long long int,从上到下找出第一个足够长的类型可以表示1234这个数,那么它就是这个整数常量的类型,如果int32位的那么unsigned int就可以表示。

小结:整数常量有十进制的整数常量(不能以0开头,否则无法和八进制区分)、八进制的整数常量(以0开头)、十六进制的整数常量(以0x0X开头)。

整数常量还可以在末尾加uU表示“unsigned”,加lL表示“long”,加llLL表示“long long”。

附件:long int_tmp_.xlsx

阅读(2916) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~