补码转原码(算术左移一位负变正)

简介:

一、文章来由

还是上一篇关于移位的问题,那么什么 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

#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; 
}

运行结果:
这里写图片描述

关于这个公式:
这里写图片描述

相关文章
|
3月前
【编程基础知识】正数负数的二进制位运算(左移 右移 无符号右移)
正数和负数需转换成二进制后进行移位运算。左移低位补0,不影响符号位;右移符号位跟随移动,最高位还原为原符号位;无符号右移高位补0,适用于负数处理。
185 0
|
8月前
|
存储
算数移位,逻辑移位以及循环移位
算数移位,逻辑移位以及循环移位
141 0
|
8月前
|
存储
原码,补码的乘法运算
原码,补码的乘法运算
136 0
|
8月前
补码浮点数运算(设数的阶码为3位,尾数为6位(均不包括符号位)按机械补码浮点运算规则完成下列[x+y]补运算。)
补码浮点数运算(设数的阶码为3位,尾数为6位(均不包括符号位)按机械补码浮点运算规则完成下列[x+y]补运算。)
404 0
|
机器学习/深度学习 存储
数据的表示:原码、反码、补码、移码以及浮点数的运算
数据的表示:原码、反码、补码、移码以及浮点数的运算
540 0
数据的表示:原码、反码、补码、移码以及浮点数的运算
原码、反码、补码的互换
计算机中国的有符号数(整数)有三种表达方式,即原码、反码、补码。
|
存储
数制间的转换,原码、反码、补码
数制间的转换,原码、反码、补码
867 0
数制间的转换,原码、反码、补码
第二次笔记: 无符号整数的表示和运算 有符号整数的表示和运算 原码 补码 反码 移码
第二次笔记: 无符号整数的表示和运算 有符号整数的表示和运算 原码 补码 反码 移码
315 0
第二次笔记: 无符号整数的表示和运算 有符号整数的表示和运算 原码 补码 反码 移码
|
C语言 编译器
C语言里的左移和右移运算
在用gcc编译这段程序的时候编译器会给出一个warning,说左移位数>=类型长度.那么实际上i,j移动的就是1位,也就是33%32后的余数.在gcc下是这个规则,别的编译器是不是都一样现在还不清楚.
2112 0