900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 正负数在计算机中的表示(原码反码补码)及位运算

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

时间:2023-09-12 21:41:25

相关推荐

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

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

正数补码就是它的原码

负数补码:

最高位是符号位,其余位为对应整数的原码取反再+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)

转换原理参考:/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)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。