C语言中关于补码的问题

最近在项目中遇到一个关于补码的问题,

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. 原码:负数的原码是其二进制表示,符号位为1。所以,-10的原码是10001010。
  2. 反码:负数的反码是其原码除了符号位之外的所有位取反。因此,-10的反码是11110101。
  3. 补码:负数的补码是其反码加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表示的是 负的多少了,

相关推荐
lingchen19061 小时前
MATLAB的数值计算(三)曲线拟合与插值
开发语言·matlab
索迪迈科技2 小时前
基于野火F407开发板实现电源管理-停止模式
c语言·stm32·单片机·嵌入式硬件·mcu
gb42152872 小时前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
一朵梨花压海棠go2 小时前
html+js实现表格本地筛选
开发语言·javascript·html·ecmascript
蒋星熠2 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
小莞尔2 小时前
【51单片机】【protues仿真】基于51单片机宠物投食系统
c语言·stm32·单片机·嵌入式硬件·51单片机
翻滚丷大头鱼2 小时前
Java 集合Collection—List
java·开发语言
aramae3 小时前
C++ -- 模板
开发语言·c++·笔记·其他
胡耀超3 小时前
4、Python面向对象编程与模块化设计
开发语言·python·ai·大模型·conda·anaconda
小马学嵌入式~3 小时前
嵌入式 SQLite 数据库开发笔记
linux·c语言·数据库·笔记·sql·学习·sqlite