1

假设我有这个号码

int x = 65535;

这是以下的十进制表示:

ÿÿ

我知道如何从单个字符中做到这一点

#include <stdio.h>

int main() {
    int f = 65535;
    printf("%c", f);
}

但这只会给我“ÿ”

我想在不使用任何外部库的情况下执行此操作,最好使用 C 类型字符串。

4

4 回答 4

2
#include <stdio.h>

int main() {
    unsigned f = 65535; // initial value

    // this will do the printf and ff >>= 8 until f <= 0 ( =0 actually)
    do {
      printf("%c", f & 0xff); // print once char. The &0xff keeps only the bits for one byte (8 bits)
      f >>= 8; // shifts f right side for 8 bits
    } while (f > 0);
}

考虑值 65535,或十六进制的 0xffff,这意味着它的正值需要 2 个字节,即 0xff 和 0xff

  • print off & 0xff只保留 8 个 LSb,(0xffff & 0xff = 0xff)
  • f >> = 8将值向右移动 8 位,0xffff 变为 0x00ff('ff' 右侧消失了
  • f > 0f == 0xff从现在开始是真的

下一个循环是相同的,但f >>= 8将 0x00ff 向右移动 => 0x0000,并且 f 为空。因此f > 0条件错误,循环结束。

于 2013-01-23T09:21:54.653 回答
2

您正在寻找的是位掩码:(x >> 8) & 0xFF对于高位字节和低位字节(x & 0xFF)。(实际上,如果int有 32 位,它是(x >> 24) & 0xFF用于高位字节。但考虑到值,以及您所说的期望,您可能需要第二个字节,而不是高位字节。)

于 2013-01-23T09:22:20.627 回答
1

你所拥有的是一个 16 位(两个字节)的无符号数。Achar是 8 位(一个字节)。这意味着您必须提取数字中的两个字节才能将它们作为单独的字符。

这是通过按位运算符完成的。您可以使用按位&和按位移位>>来完成此操作。

于 2013-01-23T09:23:05.620 回答
1

就像是

char buffer[9];
long value = 65535;
char *cur = buffer;
while (value > 0)
{
    *cur++ = value % 0x100;
    value /= 0x100;
}
*cur = 0;
于 2013-01-23T09:23:19.783 回答