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表示的是 负的多少了,

相关推荐
好开心啊没烦恼1 分钟前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
猫猫的小茶馆18 分钟前
【STM32】通用定时器基本原理
c语言·stm32·单片机·嵌入式硬件·mcu·51单片机
简佐义的博客29 分钟前
破解非模式物种GO/KEGG注释难题
开发语言·数据库·后端·oracle·golang
程序员爱钓鱼40 分钟前
【无标题】Go语言中的反射机制 — 元编程技巧与注意事项
开发语言·qt
Frank学习路上1 小时前
【IOS】XCode创建firstapp并运行(成为IOS开发者)
开发语言·学习·ios·cocoa·xcode
2301_805054561 小时前
Python训练营打卡Day59(2025.7.3)
开发语言·python
pumpkin845142 小时前
Rust 调用 C 函数的 FFI
c语言·算法·rust
lsx2024062 小时前
CSS 网页布局:从基础到进阶
开发语言
蜗牛沐雨2 小时前
警惕 Rust 字符串的性能陷阱:`chars().nth()` 的深坑与高效之道
开发语言·后端·rust