近期利用matlab保存数据到txt中,因为计算机保存数据是以补码形式进行的,所以需要将负数先转换为补码形式。其次利用vivado生成的数据通过matlab读取的时候,一定要注意也要数据转换。
原码转补码:网上大部分都是将原码变为反码,然后符号位不变数据位按位取反然后+1;但是我们一般情况下都是规定好保存的位数,例如保存8位二进制,这样子就不用麻烦了。
补码=模-|负数|
可能不是很好理解,比如说24小时,24就是模,负数就是-3,
模-|负数|=21; (这个跟按位取反+1结果是一样的)
模在计算机中是相对固定的,n位长度的寄存器数模就是2^n
下面是我做过的一个例子:
上图是需要将temp里面的东西保存到fp中,dec2bin函数是将十进制的数转换为长度为16位的二进制数(16是指定的位数)。但是如果遇到负数函数就报错,因此需要变为补码形式即(模-|负数|)也就是图上的s(i)+2^16;
负数=补码-模
比如一个八位数-1的模是256(10000 0000) ,所以-1的补码就是256-|-1| = 255 (1111 1111)、对半分的终点:256 - |-128| = 128,所以说正数最大值(127)过了就是负数最大值(-128)
下面同样举一个例子,fft_real的数据位宽是27位
上图的工作是把补码转换为原码,但是为什么出现了226和227呢?对比上面那个256的例子就能发现
当数值大于2^26的时候,就可以认定为负数需要利用公式转换。