为什么以下程序不打印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
字符。为什么我从这个程序中得到一些其他奇怪的角色?
您将按照它们在源中列出的位的相反顺序插入位。第二位将移位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
。
二进制数以相反的顺序存储在char变量中,这就是你遇到这个问题的原因。
0 1 1 1 0 0 1 1
它正在成为
1 1 0 0 1 1 1 0
在's'变量中。