负数在现代计算机里一般用补码表示(正数也是)

正数补码就是它的原码

  • 负数补码:

最高位是符号位,其余位为对应整数的原码取反再+1

如:1000 0000还原为原码:最高位是1,表示负数,剩余的各位取反 111 1111 再+1 得到 1000 0000, +128的原码,整个数为-128    (-0,但0的正负无意义,所以这里规定-0为-128)

求负整数的补码,将其对应正数二进制表示所有位取反(包括符号位,0变1,1变0)后加1 。
同一个数字在不同的补码表示形式中是不同的。比如-15的补码,在8位二进制中是11110001,然而在16位二进制补码表示中,就是1111111111110001。以下都使用8位2进制来表示。
【例2】求-5的补码。
-5对应正数5(00000101)→所有位取反(11111010)→加1(11111011)
所以-5的补码是11111011。
【例3】数0的补码表示是唯一的。
[+0]补=[+0]反=[+0]原=00000000
[ -0]补=11111111+1=00000000

转化为原码
已知一个数的补码,求原码的操作其实就是对该补码再求补码:
⑴如果补码的符号位为“0”,表示是一个正数,其原码就是补码。
⑵如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。
【例4】已知一个补码为11111001,则原码是10000111(-7)。
因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。
其余七位1111001取反后为0000110;
再加1,所以是10000111。

补码的绝对值
【例5】-65的补码是10111111
若直接将10111111转换成十进制,发现结果并不是-65,而是191。
事实上,在计算机内,如果是一个二进制数,其最左边的位是1,则我们可以判定它为负数,并且是用补码表示。
若要得到一个负二进制补码的数值,只要对补码全部取反并加1,就可得到其数值。
如:二进制值:10111111(-65的补码)
各位取反:01000000
加1:01000001(+65)

转换原理参考:https://www.cnblogs.com/pauline/p/7573208.html

  • 另一算法:设第k位为符号位,每位上的数为a[i],则值为 ,可知表示是为0~最大整数~最小负数~0

按位与运算

通常用来将某变量中的某些位清0(&0)或保留某些位不变(&1)

例如,如果需要将int型变量n的低8位全置成0,而其余位不变,则可以执行: n = n & 0xffffff00;   也可以写成: n &= 0xffffff00;

如果n是short类型的,则只需执行: n &= 0xff00;

如何判断一个int型变量n的第7位(从右往左,从0开始数)是否是1 ? 只需看表达式 “n & 0x80”的值是否等于0x80即可。

按位或运算

通常用来将某变量中的某些位置1(|1)或保留某些位不变(|0)。

例如,如果需要将int型变量n的低8位全置成1,而其余位不变,则可以执行: n |= 0xff;

左移运算符“<<”

是双目运算符。 其功能是将左操作数的各二进位全部左移若干位后得到的值,右操作数指明了要左移的位数。 左移时,高位丢弃,右边低位补0。

实际上,左移1位,就等于是乘以2,左移n位,就等于是乘以2n。而左移操作比乘法操作快得多。

特别注意:有符号数的左移溢出情况。

#include <stdio.h>
main() {int n1 = 15; short n2 = 15;unsigned short n3 = 15;unsigned char c = 15;n1 <<= 15; n2 <<= 15;n3 <<= 15;c <<= 6; printf( "n1=%x,n2=%d,n3=%d,c=%x,c<<4=%d",n1,n2,n3,c,c << 4);
}
/*
n1=78000,n2=-32768,n3=32768,c=c0,c<<4=3072
*/

右移运算符“>>”

双目运算符。 其计算结果是把“>> ”的左操作数的各二进位全部右移若干位后得到的值,要移动的位数就是“>>”的右操作数。移出最右边的位就被丢弃。

对于有符号数,如long,int,short,char类型变量,在右移时,符号位(即最高位)将一起移动,并且大多数C/C++编译器规定,如果原符号位为1,则右移时左边高位就补充1,原符号位为0,则右移时高位就补充0

实际上,右移n位,就相当于左操作数除以2^n,并且将结果往小里取整

​
#include <stdio.h>
main()
{int n1 = 15; short n2 = -15;unsigned short n3 = 0xffe0;unsigned char c = 15;n1 = n1>>2; n2 >>= 3;n3 >>= 4;c >>= 3; printf( "n1=%x,n2=%d,n3=%x,c=%x",n1,n2,n3,c);
}
/*
n1=3,n2=-2,n3=ffe,c=1//直接除2^n或化为二进制移位计算
*/​

浮点数在计算机的存储

按IEEE制定的标准,所有计算机硬件都支持。

将二进制位分为三部分:符号位S、阶码E、尾数M来表示浮点数。

单精度用32位表示,分别为1、8、23;双精度用64位表示,分别为1、11、52位。

符号位S:为0代表正数,1代表负数;

阶码E:分两种:非规格化值和规格化值。

  • 非规格化值:表示+0、-0、+∞、-∞。这时M=f的形式为0. ....,范围在[0.0,1.0)阶码求法E=1-bias  (bias为定值:,k为阶码位数,所以float型bias为127)

(1)阶码位全为0,则Exp(阶码位值)为0,阶码为-126。当S为0时表示+0,当S为1时表示-0

(2)阶码位全为1,则Exp(阶码位值)为1,阶码为-126。当M=0时为∞,当S为0时表示+∞,当S为1时表示-∞;当M!=0时为NaN

  • 规格化值:表示正负数。这时M=1+f的形式为1. ....,范围在[1.0,2.0)阶码求法E=Exp-bias  (bias为定值:,k为阶码位数,所以float型bias为127)

正负数在计算机中的表示(原码反码补码)及位运算相关推荐

  1. day017:Java进制转换、原码反码补码、位运算、位移运算符

    一.进制介绍: 1.进制:指进位制,表示某一位置上的数,运算时是逢X进一. 十进制就是逢十进一,二进制就是逢二进一,八进制就是逢八进一. 2.Java中默认的数值都是十进制,如果要输入其他进制,在数值 ...

  2. python字符串反码输出_一阶段day3-进制、原码反码补码、位运算、字符串

    一.进制 计算机在存储数据的时候都是以二进制的形式去存储的 十进制.十六进制.八进制.二进制 1.十进制 123.4.65.34255765879808 基数:0.1.2.3.4.5.6.7.8.9: ...

  3. java 二进制反码_Java学习第五篇:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题...

    public classDemo3 {public static voidmain(String[] args) { CycleLinkList cycleLinkList=newCycleLinkL ...

  4. Python之原码、补码、位运算、异或、同或

    异或与同或 异或,相异除1,相同除0 同或,相同除1,相异除0 例如:10 ^ 9 10 ^9 1010 1001 0011 等于3 例如:10 ^ -9 10 ^ -9 0000 1010 1000 ...

  5. c语言原码 补码 反码,C语言 原码--反码--补码

    //原码,反码,补码 #include #include //数值的表示方法--原码.反码和补码 //原码:最高位为符号位,其余各位为数值本身的绝对值 //反码: //正数:反码与原码相同 //负数: ...

  6. python二进制反码例题_python中的进制转换和原码,反码,补码

    python中的进制转换和原码,反码,补码 计算机文件大小单位 b = bit 位(比特) B = Byte 字节 1Byte = 8 bit #一个字节等于8位 可以简写成 1B = 8b 1KB ...

  7. 关于计算机中 原码, 反码, 补码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  8. 原码和补码在计算机中的应用,原码,补码和反码在计算机中的作用

    满意答案 xxyy5566123 2013.06.26 采纳率:58%    等级:12 已帮助:13466人 引入原码 反码 和补码的目的就是为了解决减法问题,因为计算机CPU的运算器中只有加法器, ...

  9. 计算机中的原码,计算机中的原码反码补码移码

    计算机中的原码反码补码移码 原码 数值 X 的原码记为 [X]原,如果机器字长为 n (即采用 n 个二进制位表示数据),则最高位是符号位,0 表示正号,1 表示负号,基余的 n~1 位表示数值的绝对 ...

  10. 【计算机组成原理】原码 反码 补码 移码

    目录 一.原码.反码.补码.移码的概念 1. 真值 2. 机器数 1. 原码 2. 反码 3. 补码 4. 移码 二.原码.反码.补码.移码的转换 1. 原码转反码 2. 原码转补码 3. 原码转移码 ...

最新文章

  1. 用ffmpeg把gif动图分离成多张图片和ffmpeg多张图片合成gif动图
  2. informix 访问mysql_informix用户权限的介绍及查看方法
  3. String.format() 格式化字符串
  4. 相机标定(三) —— 畸变校正
  5. Spring与Quartz集成详解
  6. Codeforces Round #172 (Div. 2) C. Rectangle Puzzle 数学题几何
  7. C程序设计语言现代方法11:指针
  8. 万能html5视频播放器安卓,XPlayer万能视频播放器
  9. 软件质量管理体系-ISO 9000
  10. 乐鑫esp8266学习rtos3.0笔记第8篇:esp8266-12模块基于rtos3.0 SDK编程扫描周围获取附近可用的 Wi-Fi 热点路由器信息,同样适合esp32。(附带demo)
  11. 非参数中的秩和检验到底怎么做的?
  12. 以天下之力成天下之事,菜鸟成物流抗疫主力军
  13. 行列式与矩阵树定理入门
  14. 【音乐系列】吉他学习入门基本知识
  15. 红黑树 之 原理和算法详细介绍
  16. H264马赛克、延时的优化
  17. LTE学习笔记四:OFDM
  18. 华为od统一考试B卷【用连续自然数之和来表达整数】C++ 实现
  19. i 智慧 | 为云而生、多快好省,这就是星星海的style!
  20. matlab标志,使用MATLAB画出的图上面出现一个标志,不知道是怎么出现的

热门文章

  1. 除了USDT,还能用什么,传说中的“USDT暴雷”是否成真?
  2. Spring Boot的优点
  3. 怎么添加扫描仪到计算机快捷键,Win7系统添加扫描仪快捷方式的方法
  4. linux 手机互传,轻松实现Linux笔记本和手机、PDA互传文件(转)
  5. 13 个优秀的 Vue 开源项目及合集推荐
  6. Pycharm2018.2破解版本闪退问题解决办法
  7. PS混合模式图文详解
  8. 你知道我们常说的“向前兼容”和“向后兼容”都是什么意思吗?
  9. 沈阳市政府 第三方社会评估总体报告
  10. CenterNet环境搭建记录