Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 带2s补码的额外字节_C - Fatal编程技术网

C 带2s补码的额外字节

C 带2s补码的额外字节,c,C,当我找到一个字节的两个补码时,我得到了很多额外的字节 例如,eb变为FFFFFF 15。当我打印这个时,它是-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); 这将打印FFFFFF 15.%d打印-235。您没有发布完整的代码,但它似乎必须是无符号字符数组或无

当我找到一个字节的两个补码时,我得到了很多额外的字节

例如,eb变为FFFFFF 15。当我打印这个时,它是-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);

这将打印FFFFFF 15.%d打印-235。

您没有发布完整的代码,但它似乎必须是无符号字符数组或无符号字符指针,或者是字符数组,并且类型char在您的平台上是无符号的。将[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;
}

试图理解这个问题:eb变成ffffff15。当我打印这个时,是-235,不是-21。 因此,您似乎期望ffffff15以十进制表示-21,这似乎是您对负整数值的表示方式有一个非常常见的误解:使一个数字为负数不仅仅是设置一个负位,而是实际上反转所有位并加1。让我们假设一个8位的示例:

1..0000001  -1..11111111
2..0000010  -2..11111110
3..0000011  -3..11111101
...

如您所见,将整数int x设为负数实际上会将其转换为int_MAX-x+1,与~x+1相同,而不是转换为x | 0x800000。反过来,0xfffff15表示0xfffffff-0xeb+1,表示-235,而不是-21

int b=inta;-这不是将两个十六进制字符转换为int的方式。char a=ab应该标记警告。ab是一个字符[3],而不是字符。我不敢相信这实际上是编译的。字符a是字符变量。它只有一个字符的空间。它编译了吗?oon需要查看完整的代码。disp被分配到什么值?哎呀,我解释了我函数的一些部分,以减少到两个补码的内容,并把一些部分搞乱了。现在已经修好了,谢谢你的密码。阵列的大小是如何变为4的?如何在数组中计算\x个字符?@Nguaial:初始值设定项是一个包含3个字符和空终止符的字符串,因此为4个字节\xeb是转义序列,\x后跟2个十六进制数字被解释为单个字符。
1..0000001  -1..11111111
2..0000010  -2..11111110
3..0000011  -3..11111101
...