标签:nbsp 保存 浮点数 表示范围 选择 val 混合 强制 符号
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。)
总结:尽量不要在你的代码中使用无符号类型,以免增加不必要的复杂性;或者使用时,在涉及混合运算时,进行强制类型转换,这样就不必由编译器来选择转换类型了。
C语言无符号和有符号的区别
标签:nbsp 保存 浮点数 表示范围 选择 val 混合 强制 符号
原文地址:https://www.cnblogs.com/cjhk/p/11664817.html