我想将无符号整数转换为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位的位清零?
答案 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