C语言无符号和有符号的区别

C语言定义一个int类型时,默认是有符号数,关键字signed常省略,如:
 
int a;
 
signed int a;
 
signed a;
 
这三句是一样的定义
 
定义无符号数时,必须加关键字unsigned,如:
 
unsigned int a ;
 
unsigned a;
 
无符号关键字unsigned,只适用于int short long char四种变量,浮点型数据只有有符号类型。
 
那么为什么float会没有无符号呢?C语言中,整型是采用二进制表示的,而浮点数却是按照整数部分,小数部分,指数部分存放的。
 
运算也是分开来运算的。这样的做法,使得浮点数可以表示很大的范围,所以unsigned无法作用于float,定义无符号的浮点型会出错。不够的话,可以用double,双精度。
 
以32位机为例,int 分为无符号 unsigned 和有符号 signed 两种类型,默认为signed。二者的区别就是无符号类型能保存2倍于有符号类型的数据。
 
32位下,signed int 的表示范围为:-2147483648 ~ 2147483647 (最高位做符号位)。
 
unsigned int 的表示范围为:0 ~ 4294967295 (不保留符号位)。我们都知道,两个不同的数据类型在进行混合使用时,会自动进行类型转换。
 
其转换原则就是:向着精度更高、长度更长的方向转换。也就是我们平常见到的 char 转为 int ,int 转为 long,float 转为 double  . etc. 
 
那么当涉及到unsigned 类型时,又会进行怎样转换呢?
 
ANSI C 标准采用值保留(value preserving)原则,就是当把几个整型操作数混合使用时,其结果的类型可能是有符号数,也可能是无符号数,这取决于操作数的类型的相对大小。
 
(通俗点说,就是两个整型数,如果都转换为signed不会丢失信息,就转换为signed;否则就转换为unsigned。)
 
总结:尽量不要在你的代码中使用无符号类型,以免增加不必要的复杂性;或者使用时,在涉及混合运算时,进行强制类型转换,这样就不必由编译器来选择转换类型了。
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/cjhk/p/11664817.html
今日推荐