在C中将无符号整数转换为48位二进制

时间:2017-04-17 02:38:02

标签: c arrays binary bit-manipulation decimal

我想将无符号整数转换为48位二进制表示的数组,如果结果小于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位的位清零?

1 个答案:

答案 0 :(得分:1)

您在 undefined中调用的行为。也就是说,C标准没有规定当您移动一个比其默认位宽更远的数字时会发生什么。所以编译器编写者可以随心所欲。

在你的例子中,似乎行为是围绕&#34;比特,使得<&lt;&lt; 32变为1&lt;&lt; 0,因此高16位似乎是低16位的重复。

正如@Jonathan Leffler在评论中提到的,您需要使用足够宽的数据类型来支持您的48位方案,或者您需要采取措施将48位输入分解为32位,无论你喜欢什么。

修改

根据您的评论,我会指出1是一个整数字面值。它有一种类型。因此,表达式1 << i的结果也有一个类型,它来自1的类型。

如果你想操作无符号长多数字,最好的办法就是尽快将所有内容放入一些正确类型的变量中。

unsigned long long ONE = 1;

ONE << i

替代方案 - 使用常量文字 - 涉及ULL后缀:

1ULL << i