重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
0100000是八进制数。即二进制数:1000 0000 0000 0000。
在巫山等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都做网站、网站建设 网站设计制作定制制作,公司网站建设,企业网站建设,品牌网站建设,网络营销推广,成都外贸网站建设,巫山网站建设费用合理。
z=value0100000;//意义就是取value的最高位。
if(z==0100000)//如果最高位是1,即为负数,需要求补
z=~value+1;//求补,即取反+1
else
z=value;
其实复杂理解是很难的,我只知道这么弄的原因是计算机只能运算加法。(至少刚开始发明的时候是这样的),其他运算都是通过加法的基础实践的。 为了操作减法不需要借位,所采用的技巧。。。。。。。可以百度,《编码的奥秘》。。。。。。
所有的数据, 什么视频, 图片, 音频, 汉字, 字母, 数字, 统统都是以二进制的形式表示的。
为了区分方便程序识别,在每个层次上都有相应的规范,
其中 正负数的表示之间的区分就是, 负数的表示方法是在正数的基础上 反码, 再加上1;就是对应的负数了,
比如3的整数表示就是原码00000011 负数就是反码11111100 加1,11111101就是-3在计算机中的存在形式;
void change( BYTE *a)
{
for( int i=0;i8;i++)
{
int x;
if(a (1i))
x = a (xi);
}
a = a^0xffff;//得到反码
a = a^x;
}
求补码的函数可以参考下面的代码,我们知道,在内存中,正数的补码等于他本身,所以直接返回a。负数的补码正是它在内存中的存在形式,这是我们定义一个unsigned int型的数值去用它来赋值,取得的就是他的补码的二进制形式。为了验证,我另外编写了一个函数,用来输出二进制,请参考。
unsigned int buma(int a)//用来求得补码
{
if(a=0)
return a;
else
{
unsigned int temp=a;
return temp;
}
}
void twoprint(unsigned int a)//用来输出二进制
{
int temp=a%2;
if(a/2==0)
{
couta" ";return ;
}
twoprint(a/2);//这里采用了递归调用的方法
couttemp" ";
}
数在计算机中是以二进制形式表示的。
数分为有符号数和无符号数。
原码、反码、补码都是有符号定点数的表示方法。
一个有符号定点数的最高位为符号位,0是正,1是副。
以下都以8位整数为例,
原码就是这个数本身的二进制形式。
例如
1000001
就是-1
0000001
就是+1
正数的反码和补码都是和原码相同。
负数的反码是将其原码除符号位之外的各位求反
[-3]反=[10000011]反=11111100
负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。
[-3]补=[10000011]补=11111101
一个数和它的补码是可逆的。
为什么要设立补码呢?
第一是为了能让计算机执行减法:
[a-b]补=a补+(-b)补
第二个原因是为了统一正0和负0
正零:00000000
负零:10000000
这两个数其实都是0,但他们的原码却有不同的表示。
但是他们的补码是一样的,都是00000000
特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!)
[10000000]补
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符号位变成了0)
有人会问
10000000这个补码表示的哪个数的补码呢?
其实这是一个规定,这个数表示的是-128
所以n位补码能表示的范围是
-2^(n-1)到2^(n-1)-1
比n位原码能表示的数多一个