2017-04-17 52 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 
相关问题