最近在项目中遇到一个关于补码的问题,
K2 = 2's complement(e) = dec(-2)
这是一个二进制数的补码表示法,
这是什么意思呢,就是说 e 表示的是 -2,就是16进制0xe表示10进制的-2;
那么问题来了,0xa表示多少,0xe表示多少呢?什么规律:
就是0xe可以转换成-2的规则,就是0xe的二进制表示是1110,这恰好是-2的补码
补码到原码转换:补码转换原码,需要先减1然后取反,1110减1等于1101,再取反就是0010就是2,再人为添加符号,就是-2,
注意:补码和原码之间的转换,主要依赖于数字的正负性。以下是一些转换的示例:
对于正数,原码、反码和补码都是相同的。例如,正数10的原码、反码和补码都是00001010。
对于负数,情况稍有不同。以下是负数-10的转换过程:
- 原码:负数的原码是其二进制表示,符号位为1。所以,-10的原码是10001010。
- 反码:负数的反码是其原码除了符号位之外的所有位取反。因此,-10的反码是11110101。
- 补码:负数的补码是其反码加1。所以,-10的补码是11110110。
还是刚才的转换,
补码转换原码,需要先减1然后取反,就等于先取反再加1,还是1110,先取反0001,在加1,就是0010,再人为添加符号,就是-2
写成代码就是
cpp
#include <stdio.h>
#include <math.h>
#include <stdint.h>
int sensor_value_convert(uint8_t fatcor)
{
int result = 0;
if ((fatcor) & 0x8) {
result = -((~(fatcor) + 1) & 0xF);
} else {
result = fatcor;
}
return result;
}
int main(void){
printf("%d\n",sensor_value_convert(0xb));
return 0;
}
通过此函数即可立即计算出0xa,0xc,0xf表示的是 负的多少了,