以下程序为什么不打印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
字符。
为什么我会从该程序中得到其他奇怪的字符?
答案 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”变量中。