c语言的左移运算,C语言中的左移和右移运算.docx
C 语言中的左移和右移运算
C 语言中的左移和右移运算 (>> 和 <
1、各种数据格式(整型int ,字符型 char 等)占有几个存储单元(不同的编译器有所不同)
在TC2.0和keil中:(也是ANSI的标准)
char占有1个字节(即8位二进制数)。unsigned char类型的变量,最大值为Oxff (十
六进制), 255 (十进制)
int占有2个字节(即16位二进制数)。unsigned int类型的变量,最大值为Oxffff (十六
进制), 65535 (十进制)
long int 占有 4 个字节
folat 占有 4个字节, long float 和 double 都占有 8个字节, long double 占 16 个字节
在VC++中:
char 占有 1 个字节, int 和 float 占有 4 个字节, double 占有 8 个字节
2、逻辑左移 /右移和算术左移 / 右移的区别(这两种位运算,仅适用于整型和字符型。对实数型 格式的数据不适用)
逻辑左移:丢弃最低位,移 1 位,得: 0111 11110 补最高位。 (假设仅左移1
逻辑左移:丢弃最低位,
移 1 位,得: 0111 1111
0 补最高位。 (假设仅左移
1 位)二进制数:
1111 1111 逻辑左
逻辑右移:丢弃最高位,
移 1 位,得: 1111 1110
0 补最低位。 (假设仅右移
1 位)二进制数:
1111 1111 逻辑左
算术左移:以保持符号位不变为基础,进行逻辑左移1000 1111
算术左移:以保持符号位不变为基础,进行逻辑左移
1000 1111 得: 1100 0111
假设仅左移 1 位)二进制数:
算术右移:以保持符号位不变为基础,进行逻辑右移假设仅右移
算术右移:以保持符号位不变为基础,进行逻辑右移
假设仅右移 1 位)二进制数:
1000 1111 得: 1001 1110
好了,进入正题: (分无符型和有符型进行讨论)
以下结果,是通过 VC++6.0 调试的( char 占 1 字节, int 占 4 字节)
需要注意的一点是: 计算里的运算都是通过二进制补码进行的, 所以在对两个操作数进行运算时, 要先将它们转化成补码形式。
1、无符型情况unsigned char 和 unsigned int
(以 unsigned char 型为例, unsigned int 型情况相同)
>> 右移
unsigned char i=0x99;// 二进制数补码形式为: 1001 1001
i=i>>1;
printf("ni=0x%xn",i);//%x 是指,运行的结果以十六进制的形式显示
程序运行结果:
i=0x4c;即卩 0100 1100
<< 左移
i=0x99;
i=<<1;
程序运行结果:
i=0x32;即 0011 0010
2、有符型char 和 int
左移 <<
char i= - 9;//i 的二进制原码: 1000 1001 补码: 1111 0111
char y=-0x49;i=i<<1;//y 的二进制原码: 1100 1001 补码: 1011 0111
char y=-0x49;
i=i<<1;
// 经逻辑左移后, i 的补码: 1110 1110 (是个
j=j<<1;(十进制)// 经逻辑左移后,j 的补码 :0001 0011 (是个正数,原码和补码一样)即18x=x<<1;// 经逻辑左移后,
j=j<<1;
(十进制)
// 经逻辑左移后,
j 的补码 :0001 0011 (是个正数,原码和补码一样)即
18
x=x<<1;
// 经逻辑左移后,
x 的补码 :1001 0010 (是个负数,需再求其补) ,得原码:
1110 1110 即 -110 (十进制)
y=y<<1; // 经逻辑左移后, y 的不码 :0110 1110 (是个正数,原码和补码一样)即 110 (十进制)
printf("i=%dnj=%dnx=%dn",i,j,x);
程序运行结果:
i= - 18;
j=18;
x= - 110;
y=110;
在 C 语言中, VC++6.0 环境下:
对一个数进行位移操作,就是对它的补码进行逻辑位移操作
如果这个数是无符型,则逻辑操作的结果就是它的最终位运算结果;
如果这个数是有符型, 则还需对个逻辑操作的结果进行一次取补, 取补后的结果方为最终运算结 果。
补充说明:
1、如果位移动的数目大于
c语言的左移运算,C语言中的左移和右移运算.docx相关推荐
- C语言问题,在位运算中,操作数每右移一位,其结果相当于什么?若左移1位,其结果相当于什么?
C语言问题,在位运算中,操作数每右移一位,其结果相当于什么?若左移1位,其结果相当于什么? 答案: 右移,除以2 左移,乘以2 比如5,5的二进制表示是101那么右移一位之后是10就是2了,是整除 ...
- C语言之负数的左移/右移运算
文章目录 前言 一.针对负数的左移运算 二.针对负数的右移运算 前言 在实际上的开发中,很少碰到针对负数的移位操作,基本上都是无符号整数即unsigned int类型.但有时候在笔试或者面试中,有可能 ...
- C语言中的左移与右移[转]
先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如: int i = 1; i = i << 2; //把i里的值左移2位 也就是说,1的2进制是00 ...
- C语言中的左移与右移
原文地址http://www.cnblogs.com/myblesh/articles/2431806.html 先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例 ...
- 单片机c语言左移的作用,单片机c语言中的左移右移
// 据说有些编译器采用逻辑右移,即左端补0 结果:a = 0xe3 (11100011) 1当左移移出的是"1"而不是0时,你该怎么想? 2 当左移的操作数是一个sign型是,你 ...
- c 语言中 的左移右移
先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如: int i = 1; i = i << 2; //把i里的值左移2位 也就是说,1的2进制是0 ...
- c语言相反数补码,C语言中补码的整数运算特性
前言 本篇博客以"SSD6-Exercise2-Data Lab: Manipulating Bits"为例,分析在对C语言中的整数采用补码(two's-complement)编码 ...
- 单片机c语言左移的作用,[转载]单片机c语言中的左移右移
单片机c语言中的左移右移 左移 变量1 << 变量2 将变量1的二进制位值向左移动由变量2所指定的位数. 例如: a = 0x8f; // 10001111 a << 2; / ...
- c语言负数左移右移_C语言里的左移和右移运算
C语言里的左移和右移运算 先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用运算符.例如:int i = 1;i = i 2; /把i里的值左移2位也就是说,1的2进制是000.0001(这 ...
最新文章
- 职场协同办公如何使用硬技能,助推团队协作更流畅?
- PXE自动化安装系统
- [csdn markdown]使用摘记一源码高亮及图片上传和链接
- 明天面腾讯,我刷了这71道面试题...
- lisp正负调换_坐标提取lisp程序
- c语言 行程长度编码,C语言编程题,求大佬帮助,关于数组的。
- 视觉SLAM十四讲学习笔记-第六讲学习笔记总结(1)---非线性优化原理
- asp.net 缓存Cache的使用总结
- 如何制作万有特性曲线图
- 使用SpringCloud实现Java分布式开发【part-2】:Ribbon负载均衡的介绍及使用方式
- Kubernets k8s中yml格式与pod yml格式
- UTAU中文版安装教程
- 颈椎病的康复锻炼方法
- DW-概率统计打卡task01
- pubg:您的客户端将在10秒内关闭,因为一个关键的防作弊进程没有正确运行。通过验证您的游戏文件的完整性来解决此问题....
- 宇信科技有限公司面试题目
- 车牌识别matlab,车牌识别matlab实现(蓝色车牌和新能源车牌)
- 9个你需要知道的PHP函数和功能
- python排序获得秩 (index)
- 新特性解读 | MySQL 8.0 对 GTID 的限制解除