如何计算⼀个有符号数的补码表⽰?
按照【谭浩强.C程序设计(第三版).北京:清华⼤学出版社,2005】的第40页⾄第41页所述,求⼀个负数的补码的⽅法如下:
【例】求-10的补码的⽅法如下:
1)取-10的绝对值10;
2)10的绝对值的⼆进制形式为1010;
3)对1010取反得1111 1111 1111 0101(这⾥假定⼀个整数占16位)
4)再加1得1111 1111 1111 0110;
即取补码的步骤是将其绝对值按位取反再加1即可……
仍基于上例进⾏分析,16位存储空间能够存储的有符号型数的范围为-2^16~2^16-1,-10的补码按⽆符号类型计算其值为65526。
编程时可⽤如下语句实现:
int i=-10;
i=~abs(i)+1;//abs为取绝对值,~为按位取反
这个语句涉及到了三个操作:⼀是求绝对值,⼆是按位取反,三是加1
其实可以⽤⼀个加法操作即可搞定……
int i=-10;
i=i+2^16;
可以验证,这种⽅法是等价的,-10+2^16=65526,在⼀个有符号型存储变量中存储这个数,相当于存储了⼀个负数……
其通⽤的⽅法是:
变量A⽤N位来存储,当其为负数时计算其补码的⽅法是A=A+2^N;
这种⽅法适⽤于以下情况但不局限于以下情况:
负75的补码怎么求例如⽤matlab产⽣了⼀组有符号型数数据,产⽣这组数据的⽬的是传给FPGA进⾏处理,当FPGA的IP核处理有符号数时就是以补码形式进⾏处理的,这⾥怎么办呢?
可以这样办:
当matlab产⽣⼀组有符号数据后,确定了在FPGA中时使⽤N位存储处理,则在matlab中再增加⼀步转换即可:
data_signed=[……];%得到有符号数组
sign=(data_signed<0);%得到与数组对应的符号数组,当数组元素⼩于0时其值为1,反之为0
data_signed=data_signed+sign.*2^N;%当数组元素⼩于1时则加上2^N,转化为补码形式
OK,就到这⼉啦,作为⼀种笔记供⾃⼰以后参考,也借各位⽹友参考……
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论