类型和运算

基本类型

c类型16为机器32位机器64位机器
char111
short222
int248
long488
long longNA88
指针248
float444
double888
long doubleNA816
注:C语言规定 long double 长度大于等于double ,long long int 大于等于long int 大于等于 int 。 long long, long double是C99增加的类型,C99还增加了其他类型。

赋值运算

自动把“=”右边的表达式的类型转换成“=”右边的变量的类型

这个过程可能导致级别提升(被赋值的类型级别高)或者降级(被赋值的类型级别低),提升通常是一个平滑无损的过程,然而降级可能导致真正的问题

位移运算

左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。

右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。
C编译一般采用的是算术右移,即对有符号数右移时,如果符号位原来为1,左面移入高位的是1。

混合运算

依照以下转换规则

高 double ←← float
↑ ↑
↑ long
↑ ↑
↑ unsigned
↑ ↑
低 int ←← char,short

当出现在表达式中时,有符号和无符号的char和short类型都将自动转换为int,float型自动转换为double
在包含两种数据类型的任何运算中,较低级别类型将会转为运算中另一个较高级别的数据类型。

符号扩展

对于要扩展量为有符号数,扩展存储位数的方法。在新的高位字节使用当前最高有效位即符号位的值进行填充。
例1:

   char a = 0xff;	//有符号值为-1,二进制为11111111,其中最高位为符号位
   short b = a;		//b的有符号值为-1,在内存中存储的值为1111111111111111

例2:

char a = 1;   //有符号值为1,二进制为00000001,其中最高位为符号位
short b = a;  //b的有符号值为1,在内存中存储的值为0000000000000001

零扩展

对于要扩展量无符号数,扩展存储位数的方法。在新的高位直接填0.
例1:
unsigned char a=0xff; //二进制为11111111,所有值都是有效值
unsigned short b=a; //b经过零扩展后,内存中存储的值为0000000011111111

有符号数的转换规则

方法
charshort符号位扩展
charunsigned char最高位失去符号位意义,变为数据位
charunsigned short符号位扩展到short;然后从short转到 unsigned short
charunsigned long符号位扩展到long; 然后从long 转到unsigned long
charfloat符号位扩展到long; 然后从long 转到float
chardouble符号位扩展到long; 然后从long 转到double
charlong double符号位扩展到long; 然后从long 转到long double
shortchar保留低位字节
shortlong符号位扩展
shortunsigned char保留低位字节
shortunsigned short最高位失去符号位意义,变为数据位
shortunsigned long符号位扩展到long; 然后从long转到unsigned double
shortfloat符号位扩展到long; 然后从long 转到float
shortdouble符号位扩展到long; 然后从long 转到double
shortlong double符号位扩展到long; 然后从long 转到double
longchar保留低位字节
longshort保留低位字节
longunsigned char保留低位字节
longunsigned short保留低位字节
longunsigned long最高位失去符号位意义,变为数据位
longFloat使用单精度浮点数表示。可能丢失精度。
longdouble使用双精度浮点数表示。可能丢失精度。
longlong double使用双精度浮点数表示。可能丢失精度。

无符号数的转换规则

方法
unsigned charchar最高位作为符号位
unsigned charshort0扩展
unsigned charlong0扩展
unsigned charunsigned short0扩展
unsigned charunsigned long0扩展
unsigned charfloat转换到long; 再从 long 转换到float
unsigned chardouble转换到long; 再从 long 转换到double
unsigned charlong double转换到long; 再从 long 转换到double
unsigned shortchar保留低位字节
unsigned shortshort最高位作为符号位
unsigned shortlong0扩展
unsigned shortunsigned char保留低位字节
unsigned shortunsigned long0扩展
unsigned shortfloat转换到long; 再从 long 转换到float
unsigned shortdouble转换到long; 再从 long 转换到double
unsigned shortlong double转换到long; 再从 long 转换到double
unsigned longchar保留低位字节
unsigned longshort保留低位字节
unsigned longlong最高位作为符号位
unsigned longunsigned char保留低位字节
unsigned longunsigned short保留低位字节
unsigned longfloat转换到long; 再从 long 转换到float
unsigned longdouble直接转换成double
unsigned longlong double转换到long; 再从 long 转换到double
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值