类型的自动转换和强制转换
实型变量
单精度类型(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次方;右移同理。实际应用中适应于硬件的实现。
说明:位运算对象只能为整型或字符型数据,不能为实型数据。