2010-08-10 55 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]); 
} 

採取的依賴於字節序