类型转换 :常考笔试题
* 窄(有符号) char(1),short(2),int(4),float(4),long(4),long long(8),double(8) (无符号) 宽
* 相同类型的有符号比无符号窄,例如int 和unsigned int计算时需要把int转unsigned int
* int起(不同类型在进行运算时,至少提升为int)例如:
int main()
{
short a = -1;
unsigned short b = 10;
int c = -1;
unsigned int d = 10;
if (a > b)//a<b ,short和unsigned short ,都需要提升为int. -1(int)>10(int)
printf("a>b\n");
else
printf("a<b\n");if (c > d)//int(4) , unsigned int(4),需要把int转为unsigned int. c>d
printf("c>d\n");
else
printf("c<d\n");return 0;
}* 隐式转换,例如char a = 200; int b=12.5; 把窄的类型往宽类型转,最后如果有赋值,一定以赋值号的左边为准
* 显示转换:强制类型转换,例如 int c = (int)12.5;
* char(有符号):-128~127
* unsigned char:0~255
* -1:二进制全1
* 十进制:1234.5=1*10^3+2*10^2+3*10^1+4*10^0+5*10^-1
* 二进制:0~1, 101.1=2^2+2^0+2^-1
* 数字(假设为1字节)转二进制:
* 标准规定:对于有符号数最高位表示符号,0表示正数1表示负数
* 128 64 32 16 8 4 2 1
* 12:0000 1100
* 13:0000 1101
* 127:0111 1111
* 255:1111 1111
* -12:1000 1100
*
* 给定二进制计算十进制数字:
1.如果是无符号数则所有的位都是数值.
例如unsigned char a=255;//二进制1111 1111->255
unsigned char b=0xf3;//二进制1111 0011->243
2.如果是有符号数则先看符号位,符号位是0则为正数,后面的数值相加
符号位是1则为负数,需要计算其绝对值(取反+1)
例如: char c = 0x73;//
char d=0x83;
char e = 0xff;
* 位运算的应用(针对二进制,速度快),假设下面的数字为1字节
* 12:0000 1100
* 13:0000 1101
* ~12:1111 0011 按位取反
* 12&13:0000 1100 按位与,相同的位都为1才为1
* 12 | 13:0000 1101 按位或,相同的位只要有一个1就为1
* 12^13:0000 0001 按位异或 ,相同的位不一样才为1
* 12<<1:000 11000 24=12*2 按位左移,右边补0,相当于乘法
* 12<<2:00 110000 48=12*4
* 12>>1:00000 110 按位右移,左边补符号位(有符号数补符号位,无符号数补0)
* -1>>1:11111 111
* 位运算练习:
* 去掉最后一位 | (101101->10110) | x>>=1
在最后加一个0 | (101101->1011010) | x<<=1
在最后加一个1 | (101101->1011011) | (x<<1) | 1
把最后一位变成1 | (101100->101101) | x|1
把最后一位变成0 | (101101->101100) | (x>>1)<<1 ;x&(~1)
最后一位取反 | (101101->101100) | x^1
把右数第k位变成1 | (101001->101101,k=3) |
把右数第k位变成0 | (101101->101001,k=3) |
右数第k位取反 | (101001->101101,k=3) |
取最右边的1位 | (1101101->1) |
取末三位 | (1101101->101) |
取末k位 | (1101101->1101,k=4) |
取右数第k位 | (1101101->1,k=4) |
当前位变1: x | 当前位1,其它位0 例如 0101-> 1101 : x|1000
当前位变0: x & 当前位0,其它位1 例如 1101->1001: x&1011
当前位取反: x^当前位1,其它位0 例如 0101 -> 1101,1101->0101 :x^1000
C语言的类型转换
最新推荐文章于 2024-07-10 07:17:40 发布