C语言易漏知识点(一)自动转换和强制转换 位运算

类型的自动转换和强制转换

实型变量

单精度类型(float)双精度类型(double)
4字节(32位)8字节(64位)
实数提供7位有效数字提供15~16位有效数字

实型常量:不分float型和double型,一个实型常量可以赋给一个float或double型变量,但变量根据其自身类型截取实型常量中相应的有效数字。

字符变量

存储字符对应的Ascll到内存单元中。字符型数据与整形数据之间可以通用,一个字符能用字符的形式输出,也能用整数的形式输出。字符型数据进行算术运算,相当于对它的ascll进行运算。

char n;
n=‘A’;
printf("%d",n);

65

自动转换:

当同一表达式中各数据的类型不同时,编译程序会自动把它们转变成同一类型后再进行计算。
转换优先级为char<int <float <double,左边的类型向右转换。 当作赋值运算时,若赋值运算左右两边的类型不同,则复制运算符右边的类型向左边的类型转换;若右边的类型高于左边的类型,则在转换时对右边的数据进行截取。

char a;
a=‘A’;
int b;
b=a;
printf("%d",b);

65

强制转换:

表现形式:(数据类型)(表达式);

char n;
int a=(int) n;

char a;
a=‘A’;
int b;
b=(int)a;
printf("%d",b);

65

位运算

按位与 “&”:若两个相应的二进制位都为1,则该位的结果为1,否则为0;

如,13&1
   00001101
&
   00000001
   00000001

按位或 “|”:若两个相应的二进制位中有一个为1,则该位的结果为1,否则为0;

如,13 | 1
   00001101
|
   00000001
   00001101
按位异或^:两个二进制位相同,为0,否则为1;

按位求反"~":0变1,1变0;

求反主要用于负数的补码与原码的转换。
原码,反码,补码。
计算机存储主要用补码,正数的反码和补码是其原码,负数的补码是其绝对值的反码加一,负数的补码转换为原码减一取反。

如, ~12
取反前: 00001100 (12) 原码
取反后: 11110011 (-13) 反码
11110100 (-12)补码
再变回原码,减一取反
00000011
00001100

左移"<<":将一个数的二进制位全部左移若干位,右边便有空位,使空位补0;

如, 12<<2
左移前 : 00001100
左移后 : 00110000

右移">>":将一个数的二进制位全部右移若干位,同左移相似,左边便有空位,因为涉及到正负符号问题,负数时空位补1,正数时空位补0;

如,-12>>2
10001100
11000110 (右移一位后)-6
11100011 (右移两位后)-3

int a=-12,b,c;
b=a>>1;
c=a>>2;
printf("%d\n%d",b,c);

-6
-3

其实,左移相当于模拟乘法,右移相当于模拟除法,每左移一位相当于乘2,左移n位,相当于乘2的n次方;右移同理。实际应用中适应于硬件的实现。
说明:位运算对象只能为整型或字符型数据,不能为实型数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值