正负数在计算机中的表示(原码反码补码)及位运算
负数在现代计算机里一般用补码表示(正数也是)
正数补码就是它的原码
- 负数补码:
最高位是符号位,其余位为对应整数的原码取反再+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)
正负数在计算机中的表示(原码反码补码)及位运算相关推荐
- day017:Java进制转换、原码反码补码、位运算、位移运算符
一.进制介绍: 1.进制:指进位制,表示某一位置上的数,运算时是逢X进一. 十进制就是逢十进一,二进制就是逢二进一,八进制就是逢八进一. 2.Java中默认的数值都是十进制,如果要输入其他进制,在数值 ...
- python字符串反码输出_一阶段day3-进制、原码反码补码、位运算、字符串
一.进制 计算机在存储数据的时候都是以二进制的形式去存储的 十进制.十六进制.八进制.二进制 1.十进制 123.4.65.34255765879808 基数:0.1.2.3.4.5.6.7.8.9: ...
- java 二进制反码_Java学习第五篇:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题...
public classDemo3 {public static voidmain(String[] args) { CycleLinkList cycleLinkList=newCycleLinkL ...
- Python之原码、补码、位运算、异或、同或
异或与同或 异或,相异除1,相同除0 同或,相同除1,相异除0 例如:10 ^ 9 10 ^9 1010 1001 0011 等于3 例如:10 ^ -9 10 ^ -9 0000 1010 1000 ...
- c语言原码 补码 反码,C语言 原码--反码--补码
//原码,反码,补码 #include #include //数值的表示方法--原码.反码和补码 //原码:最高位为符号位,其余各位为数值本身的绝对值 //反码: //正数:反码与原码相同 //负数: ...
- python二进制反码例题_python中的进制转换和原码,反码,补码
python中的进制转换和原码,反码,补码 计算机文件大小单位 b = bit 位(比特) B = Byte 字节 1Byte = 8 bit #一个字节等于8位 可以简写成 1B = 8b 1KB ...
- 关于计算机中 原码, 反码, 补码 详解
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...
- 原码和补码在计算机中的应用,原码,补码和反码在计算机中的作用
满意答案 xxyy5566123 2013.06.26 采纳率:58% 等级:12 已帮助:13466人 引入原码 反码 和补码的目的就是为了解决减法问题,因为计算机CPU的运算器中只有加法器, ...
- 计算机中的原码,计算机中的原码反码补码移码
计算机中的原码反码补码移码 原码 数值 X 的原码记为 [X]原,如果机器字长为 n (即采用 n 个二进制位表示数据),则最高位是符号位,0 表示正号,1 表示负号,基余的 n~1 位表示数值的绝对 ...
- 【计算机组成原理】原码 反码 补码 移码
目录 一.原码.反码.补码.移码的概念 1. 真值 2. 机器数 1. 原码 2. 反码 3. 补码 4. 移码 二.原码.反码.补码.移码的转换 1. 原码转反码 2. 原码转补码 3. 原码转移码 ...
最新文章
- 用ffmpeg把gif动图分离成多张图片和ffmpeg多张图片合成gif动图
- informix 访问mysql_informix用户权限的介绍及查看方法
- String.format() 格式化字符串
- 相机标定(三) —— 畸变校正
- Spring与Quartz集成详解
- Codeforces Round #172 (Div. 2) C. Rectangle Puzzle 数学题几何
- C程序设计语言现代方法11:指针
- 万能html5视频播放器安卓,XPlayer万能视频播放器
- 软件质量管理体系-ISO 9000
- 乐鑫esp8266学习rtos3.0笔记第8篇:esp8266-12模块基于rtos3.0 SDK编程扫描周围获取附近可用的 Wi-Fi 热点路由器信息,同样适合esp32。(附带demo)
- 非参数中的秩和检验到底怎么做的?
- 以天下之力成天下之事,菜鸟成物流抗疫主力军
- 行列式与矩阵树定理入门
- 【音乐系列】吉他学习入门基本知识
- 红黑树 之 原理和算法详细介绍
- H264马赛克、延时的优化
- LTE学习笔记四:OFDM
- 华为od统一考试B卷【用连续自然数之和来表达整数】C++ 实现
- i 智慧 | 为云而生、多快好省,这就是星星海的style!
- matlab标志,使用MATLAB画出的图上面出现一个标志,不知道是怎么出现的
热门文章
- 除了USDT,还能用什么,传说中的“USDT暴雷”是否成真?
- Spring Boot的优点
- 怎么添加扫描仪到计算机快捷键,Win7系统添加扫描仪快捷方式的方法
- linux 手机互传,轻松实现Linux笔记本和手机、PDA互传文件(转)
- 13 个优秀的 Vue 开源项目及合集推荐
- Pycharm2018.2破解版本闪退问题解决办法
- PS混合模式图文详解
- 你知道我们常说的“向前兼容”和“向后兼容”都是什么意思吗?
- 沈阳市政府 第三方社会评估总体报告
- CenterNet环境搭建记录