【问题标题】:why does the byte with bits 01110011 not become the character `s`?为什么位为 01110011 的字节不会变成字符 `s`?
【发布时间】:2019-02-13 11:54:06
【问题描述】:

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

【问题讨论】:

  • 打印什么?尝试以十六进制打印它怎么样,这样你就可以看到发生了什么?
  • @AndrewHenle 它打印这个字符:“Δ
  • î 不是 ascii,因此该值可能没有很好地存储

标签: c byte ascii bit


【解决方案1】:

您正在以与源中列出的顺序相反的顺序插入这些位。第二位将被移动 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

【讨论】:

    【解决方案2】:

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

    0 1 1 1 0 0 1 1
    

    变成了

    1 1 0 0 1 1 1 0
    

    在“s”变量中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      • 2019-02-23
      • 2019-03-04
      • 2015-09-14
      • 1970-01-01
      相关资源
      最近更新 更多