偏移⼆进制编码和⼆进制补码的区别
⼀、⼆进制补码
在计算机系统中,数值⼀律⽤补码来表⽰和存储,使⽤补码,可以将符号位和数值域统⼀处理;同时,加法和减法也可以统⼀处理。
正整数的补码和源码相同;
0的补码是0;
负数的补码是符号位不变,原码的各位取反,再加1。
11000000011111111 ...... 100000010000000000000001 (01111111)
-2^n -2^n-1 …… -101 …… 2^n-1
101111111+110000000+1 ...... 11111110+10000000000000001 (01111111)
1100000001000000111111111
负数补码表⽰的范围⽐原码稍宽,对于整数,范围是:-2^n~2^n-1
在32位机中定义signed short a =0xeeee;
执⾏printf(“%d\n”,a),printf(“0x%x\n”,a)的结果分别是什么呢?
signed short a = 0xeeee;
printf("%d\n",a);
printf("0x%x\n",a);
结果:
-4370
0xffffeeee
0xeeee=1110 1110 1110 1110,是有符号short型,在计算机中,负数是以补码形式存储的,即:符号位不变,原码各位取反加⼀。
现在已知负数在计算机中的存储的数值(所以变量初始化时⽤的⼗六进制,就直接初始化成补码了啊),再求这个值,顺序就反了,先减⼀再按位取反:
1110 1110 1110 1110——减1——>1110 1110 1110 1101——按位取反——>1001 0001 0001 0010,最⾼位1是负数,001 0001 0001 0010是4370,所以值为4370。
但是在32位机中,使⽤printf函数进⾏输出时都会进⾏类型隐式转换,转换为4字节的类型。
有符号类型(signed char)⽆论向有符号类型(int)还是⽆符号类型(unsigned int)转换,都会按照有符号数的转换规则(⾼位补符号位)。
⽆符号类型(unsigned char)⽆论向有符号类型(int)还是⽆符号类型(unsigned int)转换,都会按照⽆符号数的转换规则(⾼位补0)。
0xeeee是有符号位,⾼位补1,所以打印输出为:0xffffeeee
若0xeeee⾮要输出16位,可把变量强制转化:
printf("0x%x\n",(unsigned short)a);
输出结果:
0xeeee
上⾯的强制转化只为了打印显⽰,实际值⼤⼩变了。
所以对于⼆进制补码形式的编码,正负过渡不⽅便时,可以直接⽤⼗进制数来过渡。
⼆、偏移⼆进制码二进制编码转换
把补码的符号位取反就是偏移⼆进制码。
如16位的数,0x0000是-32768,0x8000是0,0xFFFF是32767,偏移⼆进制码⽤⼗六进制时正负过渡⽐较⽅便
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论