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

相关推荐
小小de风呀4 小时前
de风——【从零开始学C++】(十一):list的基本使用和模拟实现
开发语言·c++·list
三行数学4 小时前
Matlab之父克利夫·莫勒尔逝世
开发语言·matlab
陌路204 小时前
C++高级进阶--夯实进阶基础(1)
开发语言·c++
梦想三三4 小时前
【PYthon词频统计与文本向量化】苏宁易购评论分析实战
开发语言·python
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题 第93题】【Mysql篇】第23题:从查找速度来看,聚集索引和非聚集索引哪个更快?
java·开发语言·数据库·mysql·面试
zlinear数据采集卡4 小时前
基准电压电路深度解析:从理论参数到ZLinear采集卡的精准参考实战
c语言·单片机·嵌入式硬件·fpga开发·自动化
Cheng小攸5 小时前
入侵检测环境部署
开发语言·php
日晨难再5 小时前
C语言&Python&Bash&Tcl:全局变量和局部变量
c语言·python·bash·tcl
我是唐青枫5 小时前
Java MyBatis-Flex 实战指南:从 BaseMapper 到 QueryWrapper 的轻量 ORM 用法
java·开发语言·mybatis
ShyanZh6 小时前
Markitdown 多格式文档智能解析实战指南
开发语言·c#