深度剖析位运算

  • 再论数据类型

        shortint的表示范围不同,本质差异是什么?

  • 不同类型的本质在于:

       -占用的内存大小不同

           如:short占用2字节,int占用4字节。

       -表示数据的具体方式不同

         1. 正整数用原码表示,负整数用补码表示。

         2. 正整数和浮点数的二进制表示不同。

  • 位运算时需要明确知道的事

          -操作数的类型(占用的内存大小)

          -操作数的正数还是负数(占用的内存大小)

          -不同类型的操作数先自动对齐在进行位运算(补符号位

                  short a=1;

                  int b=4;

                  int c=a|b;

                  printf("c=%d\n",c);

  • 示例

# include<stdio.h>

   int main()

{

   short a=1;

   short b=2;

   int c= a - b;

   c =c  》4;

   printf(" c = %d\n",c);

   c =c * - 1 * 16  》4;

   printf("c=%d\n",c);

实践操作

(1)

 

(2)如果是左移两位(16《 2)

 

 

  • 小结论

    -正数符号位为0,右移运算时,高位补0,低位移除

    -负数符号位为1,右移运算时,高位补1,低位移除

    -左移运算时,最高位移除,低位补0

    - 最高位的具体位置,有数据类型决定

  • 类型补充小知识

    - char-字符型,一个字节的整形,范围[-128,127]

    - 字符数据(单引号括起来的字符)的本质是整型数

    - char类型的变量可以打印为整数或字符

示例分析

char c='A';

short a=c;

int b=c;

printf("c=%c\n",c);

printf("c=%d\n",c);

printf("a=%d\n",a);

printf("b=%d\n",b);

c=0x40;

printf("c=%d\n",c);

c=c<<1;

printf("c=%d\n",c);

  • 实践操作

如下两幅图可知,最后计算的与实际的不符,

这是因为

 

如果将c再左移一位会怎样?

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值