C语⾔⽆符号和有符号的区别
C语⾔定义⼀个int类型时,默认是有符号数,关键字signed常省略,如:
int a;
signed int a;
signed a;
这三句是⼀样的定义
定义⽆符号数时,必须加关键字unsigned,如:
unsigned int a ;
unsigned a;
⽆符号关键字unsigned,只适⽤于int short long char四种变量,浮点型数据只有有符号类型。
c语言和c++区别
那么为什么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。)
总结:尽量不要在你的代码中使⽤⽆符号类型,以免增加不必要的复杂性;或者使⽤时,在涉及混合运算时,进⾏强制类型转换,这样就不必由编译器来选择转换类型了。