gpt4 book ai didi

c - 带 2 补码的额外字节

转载 作者:行者123 更新时间:2023-11-30 18:49:05 25 4
gpt4 key购买 nike

当我找到一个字节的二进制补码时,我得到了很多额外的字节。

例如“eb”变成“ffffff15”。当我 printf 时,它是 -235,而不是我期望的 -21。

//unsigned char a[] holds bytes
int b=(int)a[i];
bit1=(b & 0x80 ? 1 : 0);
if (bit1==1){
b=((~b)+1);
}
printf("b: %02x",b);

这将打印 ffffff15。 (%d 打印 -235)。

最佳答案

您没有发布完整的代码,但看起来a必须是一个unsigned char数组或一个unsigned char指针,或者一个char 数组和类型 char 在您的平台上是无符号的。将 a[i] 转换为 (int) 不会更改该值,并且计算结果为 235

公式b=((~b)+1);不会扩展最高有效位,而只是计算为b = -b。因此结果是-235

要复制到最高有效位,您可以编写:

b = (a[i] & 0xFF) | (-bit1 & ~0xFF);

这是一个完整的示例:

#include <stdio.h>

int main() {
// a is a byte array
unsigned char a[] = "0a\xeb";

for (size_t i = 0; i < sizeof a; i++) {
int b = (int)a[i];
int s = (b & 0xFF) | ((b & 0x80) ? ~0xFF : 0);
printf("a[%zd] = 0x%hhx, b: 0x%x, %d, s: 0x%x, %d\n",
i, a[i], b, b, s, s);
}
return 0;
}

它打印:

a[0] = 0x30, b: 0x30, 48, s: 0x30, 48
a[1] = 0x61, b: 0x61, 97, s: 0x61, 97
a[2] = 0xeb, b: 0xeb, 235, s: 0xffffffeb, -21
a[3] = 0x0, b: 0x0, 0, s: 0x0, 0

关于c - 带 2 补码的额外字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43797099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com