首先用4位来解释,32位太长,不好解释,四位有符号数的范围是-8~7,无符号数是0~15. 111011000100
首先,我们从书上了解到关键的几个知识点: 按照【谭浩强.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; 这种方法适用于以下情况但不局限于以下情况: 例如用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,转化为补码形式 参考: |
|
来自: Ricky_图书馆 > 《软件编程/MCU》