C语言的类型转换

类型转换  :常考笔试题
* 窄(有符号) 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
     

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秉麟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值