补码转原码(算术左移一位负变正)
2015-12-05 01:18
741 查看
一、文章来由
还是上一篇关于移位的问题,那么什么 int 型数只算术左移一位就可以从负数变成正数???二、又谈补码
很早之前写过一篇关于补码的文章,但是长时间不看又差不多忘记了,翻出来看发现写的挺烂的,有点没说明白,所以希望这里能说明白~~关于补码,我们知道:
在计算机中,一切的一切都是用补码存储
打一个比喻,东西在计算机中是用各种编码存储,不论是字符还是指针(指针也是存储的数据),都是用补码存储。我们写的代码相当于是一个外文的说明书,而编译器是翻译器,将我们的说明书翻译告诉机器如何解读那些存储的信息。
比如同样一个 128,用char解读会出现神奇的效果(详见下篇),但是用int解读还是128!!
代码告诉机器如何解读存储的数据
三、找出这个数
回到正题,那么什么 int 型数只算术左移一位就可以从负数变成正数? 这个数的从左向右数的第二位必然为0,可以是 10111…1(30个1)。那么这个数究竟是多少呢?
有一个补码转原码的计算方式是,第一位是符号位
如:1000 = -8,1001 = -8 + 1 = -7, 1011 = -8 + 2 + 1 = -5
即
-2^32+0*2^31+1*2^30+…+1*2^0
= -2^31+2^30-1
=-1073741825
[code]#include <stdlib.h> #include <stdio.h> #include <iostream> using namespace std; void showInBinary(int number) { char string[100]; itoa(number, string, 2); printf("integer = %3d string = %s\n", number, string); } int main() { int number = -1073741825; cout<<"左移之前"<<endl; showInBinary(number); number = number<<1; cout<<"左移之后"<<endl; showInBinary(number); return 0; }
运行结果:
关于这个公式:
相关文章推荐
- arduino开发过程中编译问题undefined reference to `setup'的解决办法
- 黑马程序员--java基础-方法重载与数组
- 自定义HorizontalScrollView之侧滑
- 不刷新改变URL: pushState + Ajax
- android 开发中常见问题
- 10004---HTML框架(iframe与framset,frame)
- 百度地图应用
- duilib进阶教程 -- 总结 (17)
- 2013 duilib入门简明教程 -- 总结 (20)
- JS中获取contextPath的方法
- 页面缓存
- 利用pushState开发无刷页面切换
- Anaconda2+Theano 安装过程中的所有的坑。。。
- 【android_温故知新】第 4 组 UI 组件:AdapterView 及其子类
- css的定位,relative/absolute/fixed的用法
- KDB调试Linux4.2.6内核过程记录
- Rust 1.0发布半年后社区涌现的项目集锦
- 在mac os x下配置NS2开发环境
- PAT1006(A)
- 求最长回文子串的manchester算法