比方说,我有这个数转换小数为char /串
int x = 65535;
这是十进制表示:
YY
我知道我可以做到这一点单个字符
#include <stdio.h>
int main() {
int f = 65535;
printf("%c", f);
}
但是这只会给我“ÿ”
我想这样做,而不使用任何外部库,并最好使用C类型的字符串。
比方说,我有这个数转换小数为char /串
int x = 65535;
这是十进制表示:
YY
我知道我可以做到这一点单个字符
#include <stdio.h>
int main() {
int f = 65535;
printf("%c", f);
}
但是这只会给我“ÿ”
我想这样做,而不使用任何外部库,并最好使用C类型的字符串。
#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的& 0xff的= 0xff的)f >> = 8
值8位向右移动,变为为0xFFFF设为$ 00FF(该“FF”右侧都消失了f > 0
为真,因为现在f == 0xff
下一个循环是一样的,但是f >>= 8
将0x00ff移到右边=> 0x0000,并且f是空的。 因此f > 0
条件是错误的,循环结束。
这将与他的具体价值,但不是一般。 (例如,如果'x> 65535',会发生什么? –
呃..我需要更大的值,任何想法? –
重写的答案(与'f = 0一起工作;'以及) –
你要找的是位屏蔽:(x >> 8) & 0xFF
为 高位字节,而(x & 0xFF)
为低位。 (实际上, 如果int
有32位,这是(x >> 24) & 0xFF
的高阶 字节。但给出的值,你说你的期待, 你可能想第二个字节,而不是高位字节的内容。)
你有什么是一个16位(两个字节)的无符号数字。 A char
是8位(一个字节)。这意味着您必须提取数字中的两个字节才能将它们作为单独的字符。
这是用位运算符完成的。您可以使用按位和&
和按位移>>
来完成该操作。
喜欢的东西
char buffer[9];
long value = 65535;
char *cur = buffer;
while (value > 0)
{
*cur++ = value % 0x100;
value /= 0x100;
}
*cur = 0;
对不起。但是这是什么?你能解释一下吗? – Krishnabhadra
我也不明白,但显然它工作@ _ @ –
'比方说,我有这个数 INT X = 65535; 这是十进制表示形式: ÿÿ' wat? – Eregrith
我可能解释错了,ÿÿ是65535,因为“49”是“1”。由于ÿ是十进制的255,因此Latin是(255 * 256)+255 = 65535 –
Latin在Latin-1或Windows-1252中为255。 –