2010-08-10 52 views

回答

1

最简单可行的方法 - 用sprintf(或snprintf的,如果你有的话):

unsigned char a[SOMESIZE] 
int n = 1234; 
sprintf(a, "%d", n); 

或者,如果你想让它存储在二进制:

unsigned char a[sizeof(int) ]; 
int n = 1234; 
memcpy(a, & n, sizeof(int)); 
+2

警告井井有条:'memcpy'会产生不可预知的行为,如果你不考虑字节序。 – Zarel 2010-08-10 10:11:56

+3

@Zarel结果将完全可预测,但可能不需要。 – 2010-08-10 10:13:00

+0

“不可预知”,因为除非您知道运行它的处理器的字节序,否则您将无法预测结果。 – Zarel 2010-08-10 10:17:44

0

警告:未经测试的代码。

这应该是一个排序不可知的转换。它从低到高。可能有更有效的方法来做到这一点,但目前我想不起来。

#include <limits.h> // CHAR_BIT, UCHAR_MAX 

int num = 68465; // insert number here 
unsigned char bytes[sizeof(int)]; 
for (int i=0; i<sizeof(int); i++) 
{ 
    bytes[i] = num & UCHAR_MAX; 
    num >>= CHAR_BIT; 
} 

我发布这个主要是因为我没有看到另一个解决方案,其中结果不会改变,取决于你的处理器是什么endianness。

+0

但是也许用户希望它们改变 - 以保持与原始int相同的字节顺序。此外,您的数组大小和循环控制计算是错误的。 – 2010-08-10 10:38:48

7

或者,如果你知道你在做什么:

int n = 12345; 
char* a = (char*)&n; 
0

我理解这个问题作为一个数转换为字符串表示(如尼尔一样)。

下面是一个不使用lib的简单方法。

int i = 0; 
int j = 0; 
do {a[i++] = '0'+n%10; n/=10;} while (n); 
a[i--] = 0; 
for (j<i; j++,i--) {int tmp = a[i]; a[i] = a[j]; a[j] = tmp;} 

的问题可能需要一些澄清,别人显然明白你就想为int的内部表示所使用的基础字节(但如果你想要做的事情,你最好使用定义的一些固定大小类型而不是int,否则你将无法确定字节数组的长度)。

1

这可能是工作

int n=1234;  
const int arrayLength=sizeof(int); 
unsigned char *bytePtr=(unsigned char*)&n; 

for(int i=0;i<arrayLength;i++) 
{ 
    printf("[%X]",bytePtr[i]); 
} 

采取的依赖于字节序