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

相关推荐
oort12312 分钟前
VLStream:全开源决策式AI视频平台,赋能企业构建自主可控、降本增效的智能视觉应用介绍
大数据·开发语言·人工智能·开源·音视频·数据库架构
c2385643 分钟前
c/c++中的多态(上)
开发语言·c++
彷徨而立1 小时前
【C++】介绍 std::ifstream 输入文件流
开发语言·c++
罗超驿1 小时前
13.JavaScript 新手入门指南:语法、变量、流程控制全解析
开发语言·javascript
yingjie1101 小时前
Scanpy vs Seurat 深度对比:Python 与 R 的单细胞分析框架谁更强?
开发语言·python·r语言·生物信息学·单细胞转录组·seurat·scanpy
程序大视界1 小时前
【C++ 从基础到项目实战】C++(六):拷贝控制——浅拷贝与深拷贝,兼谈智能指针
开发语言·c++·cpp
luck_bor1 小时前
IO流知识点笔记
java·开发语言·笔记
程序大视界2 小时前
【Python系列课程】Pandas(四):数据统计与排序——describe、sort_values、sample
开发语言·python·pandas
KWTXX2 小时前
使用matlab官网的skills调用claude-待完成
开发语言·matlab