C语言移位运算 左移长度大于数据类型字节数的情况
看CMU的CSAPP课程时,遇到一个很有意思的问题,特此查询资料,记录一下
1. 测试
sizeof(int) = 4 // int 数据类型位4个字节(32位)
- 测试程序1: 把
a
左移30位时 (正常)
#include<stdio.h>
int main()
{int a = 1;printf("%d\n",a << 30);return 0;
}
输出:
4
1073741824
- 测试程序2: 把
a
左移31位时 (溢出)
#include<stdio.h>
int main()
{int a = 1;printf("%d\n",a << 31);return 0;
}
输出:
4
-2147483648
- 测试程序3: 把
a
左移32位时 (神奇的事情发生了)
#include<stdio.h>
int main()
{int a = 1;printf("%d\n",a << 32);return 0;
}
输出:
4
1
- 测试程序4: 把
a
左移34位时
#include<stdio.h>
int main()
{int a = 1;printf("%d\n",a << 34);return 0;
}
输出:
4
4
在左移位数大于31时,编译器出现警告
[Warning] left shift count >= width of type
2. 结论
假设我们的数据类型是 由m
位组成,那么在进行移位运算,移动的位数k>=m
时便会出现上述问题。
C语言标准规避了在这种情况下的做法。在许多机器上,当移动一个m
位的数据时,移位指令只考虑位移量的低 log2m
位,故位移量即是通过计算 k mod m
得到的。如上述例子,int
数据类型位32
位,1<<34
即等价于1<<2
,因为 34 mod 32 = 2
。
但在Java
语言中,完全按照上述求模的方法进行计算!
参考:深入理解计算机系统(第三版)
C语言移位运算 左移长度大于数据类型字节数的情况相关推荐
- 移位运算(左移和右移)
如有转载,请注明出处: http://www.cnblogs.com/flydoos/archive/2011/09/06/2169280.html 移位运算(左移和右移) 这是网上流传的" ...
- C语言常见数据类型字节数和打印格式总结(快速掌握)
目录 一.简介 二.字节数对比 三.输出不同类型格式 四.常用类型简写总结 一.简介 本文主要介绍C语言常见数据类型字节数.不同类型输出格式和c程序中不同类型的简写总结.c语言中,常见数据类型的字节数 ...
- c语言移位运算的作用,C语言的移位操作符使用方法
位移位运算符是将数据看成二进制数,对其进行向左或向右移动若干位的运算.位移位运算符分为左移和右移两种,均为双目运算符.第一运算对象是移位对象,第二个运算对象是所移的二进制位数.以下是小编为大家搜索整理 ...
- C语言占位符及各种变量占用字节数
简介: 自己复习C语言的时候总结了一下格式化输入输出占位符,以及各种变量的占用字节数,还有没提到的后面慢慢补充.(第一次学着发博客总结^-^,也可以帮助自己后续回顾) 部分变量类型及占用字节数: (C ...
- c++ 基本数据类型字节数
关于这个基本的问题,很早以前就很清楚了,C标准中并没有具体给出规定那个基本类型应该是多少字节数,而且这个也与机器.OS.编译器有关,比如同样是在32bits的操作系统系,VC++的编译器下int类型为 ...
- mysql基础数据类型字节数_MySQL基础之数据类型
1.整数类型 整数类型包括: 整数类型 字节数 无符号数的取值范围 有符号的取值范围 TINYIN 1 0~255 -128~127 SMALLINT 2 0~65535 -32768~32768 M ...
- Mohican_4/6 C语言 移位运算 代码#FloatToInt
注意 : 第一种方法不可取,因为与FloatToInt的内部原理有差距 但是表面可以完成FloatToInt的基本功能 第二种方法可取 使用知识点位段操作 #include <stdio.h ...
- C语言移位运算(<<)
上来个题目给大家感受下 解题 #include<stdio.h> int main() {int x;while(scanf("%d",&x)!=EOF){pr ...
- 32位/64位机上常用数据类型字节数(C语言)
可用如sizeof(char),sizeof(char*)等得出 32位编译器 char :1个字节 char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节 ...
最新文章
- Netbackup 添加策略_报NFS.Skipping
- 微信小程序 bindtap 绑定事件
- apache mysql 添加到开机自动启动
- You Need This One Skill to Succeed in IT--reference
- python中文人名识别(使用hanlp,LTP,LAC)
- 米家扫地机器人是石头代工_扫地机器人“两强”突进,选科沃斯还是石头科技?...
- 理想制动力分配曲线matlab源代码_宝马进入“血拼”状态,动力倍儿棒
- babel import语法 js_webstorm配置babel自动转译es6的两种方法
- 【软件】RustDesk自己搭建远程控制服务软件 支持控制手机
- 一键查询网站服务器归属地,一文搞定3种批量查询手机归属地的方法
- Jruby On Rails 的安装及部署实践
- 如何使用计算机远程关闭手机软件,如何用手机远程控制电脑关机
- “五子登科”新解之“票子,房子,车子,妻子,孩子”
- nodejs ffi调用C++dll动态库 ffi调用语法
- 怎样设计一个好的社交网站
- anydesk 自建服务器,AnyDesk使用FRP自建远程桌面连接
- PCB工程师级别评定标准
- 计蒜客 因数最多的数
- Android之WebView的使用与简单浏览器
- Cglib入门到使用
热门文章
- datastage 函数_DataStage常用函数大全.doc
- 2d3d卫星地图转换+搜索js+html+css实现
- 基于百度翻译API和python的批量地名翻译的实现
- oa是什么意思?oa系统哪个好用?
- 2021-11-01 - 互联网常用英文缩写:DAU、ROI、MCN......
- 从one hot vector到Attention, Bert——NLP基本思想串连回顾
- 震撼!行李自动化物流系统
- 点杀 美女游戏.exe,mmlucj.exe,severe.exe病毒
- linux配置虚拟ip
- 为什么方差公式要用平方而不用绝对值_为什么方差公式要用数据与平均数之差的平方来衡量而不是用绝对值?...