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

相关推荐
2501_944521596 小时前
Ramda 跨端三方库仓颉适配全流程
开发语言·javascript·flutter·php
行思理7 小时前
go语言学习难度及适合学习的人群
开发语言·学习·golang
wangchunyu1148 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
程序 代码狂人9 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
meiying883810 小时前
快递单号批量查询Python脚本:从手动到自动化的完整实现
开发语言·python·自动化
Zwawa11 小时前
编译器工具链:GCC、Clang、MSVC、ICC、armclang
c语言·嵌入式·编译器
@大迁世界11 小时前
告别 Go,拥抱 Rust
开发语言·golang·rust
SEO_juper11 小时前
Node.js 重定向链检测工具:301 跳了几跳、有没有成环,一次看清
xml·开发语言·python·node.js·json·bash
学逆向的11 小时前
C 指针常量与常量指针
c语言·开发语言·网络安全
水饺编程12 小时前
第2章:Linux 基础,exit 命令
linux·c语言·汇编