2017-04-17 80 views
1

我想將無符號整數轉換爲48位二進制表示的數組,如果結果小於48位,則需要將其餘位清零。這裏的功能:將無符號整數轉換爲C中的48位二進制數

char *getBinary(unsigned int num) 
{ 
char* bstring; 
int i; 
bstring = (char*) malloc(sizeof(char) * 49); 
assert(bstring != NULL); 

bstring[48] = '\0'; 
for(i = 0; i < 48; i++) 
{ 
    bstring[48 - 1 - i] = (num == ((1 << i) | num)) ? '1' : '0'; 
} 
return bstring; 
} 

,並在主功能:

unsigned int nbr1=3213816984; 
char * bi=getBinary(nbr1); 

結果應該是:

000000000000000010111111100011101111010010011000 

而是我的了:

111101001001100010111111100011101111010010011000 

爲什麼我不能將超過32比特的比特清零TS?

+1

由於'無符號整型num'是一個32位的量。在轉換之前,您必須將其轉換爲64位數量,例如'unsigned long long'。 –

+0

@JonathanLeffler嗨,感謝您的回覆!我試圖使用無符號long long,但仍然得到相同的結果。 –

+0

您必須將接口更改爲該函數,以便接受64位(或大於32位)值 - 在任何常規平臺上,您基本上永遠不會獲得超過32位的值。 '1 << i'中的'1'也是一個'int',因此也是32位。你可能需要在那裏使用'1ULL << i'。另外,'num ==((1ULL << i)| num)'可能沒有做你想做的。你可能需要'((1ULL << i)#)!!= 0'或其附近。 –

回答

1

您在中調用的行爲未定義。也就是說,C標準沒有規定當你將一個數字轉換得比它的默認位寬更遠時會發生什麼。所以編譯器編寫者可以做任何他們想要的。

在您的例子,它好像行爲是「環繞」的位,使得1 < < 32變爲1 < < 0,所以高16位似乎是低16位的重複。

正如@Jonathan Leffler在評論中提到的,您需要使用足夠寬的數據類型來支持您的48位方案,或者您需要採取措施將您的48位輸入分解爲32位碎片,無論你喜歡什麼。

編輯:

基於您的評論,我會指出1是文字的整數。它有一個類型。所以表達式1 << i的結果也是一個類型,它來自於1的類型。

如果您想對無符號長整型數進行操作,最好的辦法是儘快將所有內容放入正確類型的變量中。

unsigned long long ONE = 1; 

ONE << i 

替代 - 使用常量文字 - 涉及ULL後綴:

1ULL << i 
相關問題