C语言----数据类型与表达式(进阶篇十六)
。。。
无符号整数的范围
unsigned short的取值范围为0~65535。
unsigned short占有2个字节,也就是16位,在计算机内部用(0000 0000 0000 0000)2表示0,用(1111 1111 1111 1111)2表示最大数。
(1)2表示1,(11)2表示3,(111)2表示7……(1111 1111 1111 1111)2表示65535,刚好是21-1、22-1、23-1……216-1,得出无符号整型的计算公式为0~2n-1(n为整型位数)。
补码
补码中第一位表示正负数:0表示正数,1表示负数。
补码原理
要求一个负数的补码,将它的绝对值二进制按位取反再加1,正数的补码是自己。
如求4位二进制数-3的补码:把(3)10=(0011)2按位取反得(1100)2,再加1得(1101)2,short型只是把4位扩展为16位(0000 0000 0000 0011)2,按位取反得(1111 1111 1111 1100)2,加1得(1111 1111 1111 1101)2。
16位二进制数-32768的补码:将32768转成二进制得(1000 0000 0000 0000)2,取反得(0111 1111 1111 1111)2,加1得 (1000 0000 0000 0000)2
补码的特点是可以把减法运算转换成加法,比如一个4位二进制减法(0011)2-(0001)2在CPU中会先取得(0001)2的补码(1111)2,将此变成加法运算 (0011)2+(1111)2得到(10010)2,因为运算器只有4个位,前面的1舍去,得到正确结果(0010)2,这样CPU中就可以省去一个做减法运算的元件。
不同类型的混合运算
※赋值语句中,等号两边类型不同时,以左边类型为准。
如:
int a=300;
char b;
b=a; /*不可预期的错误,但系统不会报错*/
※除法运算时,2/3的结果为0,2.0/3或者2/3.0结果都为0.66666……。这说明如果除号两边都是整数,结果只能是整数,除号两边有任意一个浮点数,结果就是精确的浮点数。
混合运算时也遵循上述规律:
double d=1.0+2/3;
会先算2/3,这时答案已经是0,再加1.0,得到错误的结果1.0,改成
double d=1.0+2/3.0;
结果为1.666666,正确。
※char参与任何运算都会转换成ASCII码
※%(取余)不能用在浮点数上,它不会自动将浮点数转换成整数。
强制转换
格式:
(类型名)表达式
如:
double d=(double)2/3+1.0;
相当于double d=2.0/3+1.0;
与double d=2/3.0+1.0;运算结果相同