假设我有这个号码
int x = 65535;
以下是小数表示:
YY
我知道如何从单个字符
中做到这一点#include <stdio.h>
int main() {
int f = 65535;
printf("%c", f);
}
但这只会给我“ÿ”
我想这样做而不使用任何外部库,最好使用C类型字符串。
答案 0 :(得分: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
f & 0xff
仅保留8 LSb,(0xffff&amp; 0xff = 0xff)f >> = 8
将值向右移8位,0xffff变为0x00ff('ff'右侧消失f > 0
自f == 0xff
现在下一个循环是相同的,但是f >>= 8
将0x00ff移到右边=&gt; 0x0000,f为空。
因此f > 0
条件错误,循环结束。
答案 1 :(得分:2)
您正在寻找的是位屏蔽:(x >> 8) & 0xFF
高位字节,低位(x & 0xFF)
。 (其实,
如果int
有32位,则高位为(x >> 24) & 0xFF
字节。但鉴于价值观,以及你所说的期望,
你可能想要第二个字节,而不是高阶字节。)
答案 2 :(得分:1)
你拥有的是一个16位(两个字节)的无符号数。 char
是8位(一个字节)。这意味着您必须提取数字中的两个字节,以将它们作为单独的字符。
这是通过按位运算符完成的。您可以使用按位和&
以及按位移位>>
来完成此操作。
答案 3 :(得分:1)
像
这样的东西char buffer[9];
long value = 65535;
char *cur = buffer;
while (value > 0)
{
*cur++ = value % 0x100;
value /= 0x100;
}
*cur = 0;