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

问题描述 投票:1回答:2

为什么以下程序不打印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字符。为什么我从这个程序中得到一些其他奇怪的角色?

c byte ascii bit
2个回答
8
投票

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

1 1 0 0 1 1 1 0

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

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

这是一个固定的尝试:

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


0
投票

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

0 1 1 1 0 0 1 1

它正在成为

1 1 0 0 1 1 1 0

在's'变量中。

© www.soinside.com 2019 - 2024. All rights reserved.