2013-01-23 98 views
1

比方说,我有这个数转换小数为char /串

int x = 65535; 

这是十进制表示:

YY

我知道我可以做到这一点单个字符

#include <stdio.h> 

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

但是这只会给我“ÿ”

我想这样做,而不使用任何外部库,并最好使用C类型的字符串。

+6

'比方说,我有这个数 INT X = 65535; 这是十进制表示形式: ÿÿ' wat? – Eregrith

+0

我可能解释错了,ÿÿ是65535,因为“49”是“1”。由于ÿ是十进制的255,因此Latin是(255 * 256)+255 = 65535 –

+2

Latin在Latin-1或Windows-1252中为255。 –

回答

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的& 0xff的= 0xff的)
  • f >> = 8值8位向右移动,变为为0xFFFF设为$ 00FF(该“FF”右侧都消失了
  • f > 0为真,因为现在f == 0xff

下一个循环是一样的,但是f >>= 8将0x00ff移到右边=> 0x0000,并且f是空的。 因此f > 0条件是错误的,循环结束。

+0

这将与他的具体价值,但不是一般。 (例如,如果'x> 65535',会发生什么? –

+0

呃..我需要更大的值,任何想法? –

+1

重写的答案(与'f = 0一起工作;'以及) –

2

你要找的是位屏蔽:(x >> 8) & 0xFF为 高位字节,而(x & 0xFF)为低位。 (实际上, 如果int有32位,这是(x >> 24) & 0xFF的高阶 字节。但给出的值,你说你的期待, 你可能想第二个字节,而不是高位字节的内容。)

1

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

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

1

喜欢的东西

char buffer[9]; 
long value = 65535; 
char *cur = buffer; 
while (value > 0) 
{ 
    *cur++ = value % 0x100; 
    value /= 0x100; 
} 
*cur = 0; 
+1

对不起。但是这是什么?你能解释一下吗? – Krishnabhadra

+0

我也不明白,但显然它工作@ _ @ –