为什么位01110011的字节不变成字符's`?

时间:2019-02-13 11:54:06

标签: c byte ascii bit

以下程序为什么不打印s字符?:

#include <stdlib.h>
#include <stdio.h>


int main(void) {
    unsigned char s = '\0';
    unsigned int bits[8] = {0, 1, 1, 1, 0, 0, 1, 1};

    for (int i = 0; i < 8; i++) {
        s ^= bits[i] << i;
    }

    printf("%c\n", s);

    return 0;
}

因此,我基本上是在尝试从位列表中创建s字符。 为什么我会从该程序中得到其他奇怪的字符?

2 个答案:

答案 0 :(得分:8)

您要按与源中列出的位相反的顺序插入位。第二位将移位1,而不是6,依此类推。所以得出的数字是

1 1 0 0 1 1 1 0

为0xce,十进制206,因此为非ASCII。

此外,使用XOR进行操作非常奇怪,它应该只是常规的按位或(|)。

这是固定的尝试:

char s = 0;
const unsigned char bits[] = { 0, 1, 1, 1, 0, 0, 1, 1 };

for (int i = 0; i < 8; ++i) {
    s |= bits[i] << (7 - i);
}
printf("%c\n", s);

这将打印s

答案 1 :(得分:0)

二进制数以相反的顺序存储在char变量s中,这就是您遇到此问题的原因。

0 1 1 1 0 0 1 1

它正在变得

1 1 0 0 1 1 1 0

在“ s”变量中。