2016-02-25 108 views
-1

我想一个unsigned long转换为二进制文件C.转换一个unsigned long二进制用C

char* long_to_binary(unsigned long k) 

{ 
     static char c[65]; 
     c[0] = '\0'; 

     unsigned long val; 
     for (val = ULONG_MAX; val > 0; val >>= 1) 
     { 
      strcat(c, ((k & val) == val) ? "1" : "0"); 
     } 
     return c; 
    } 

我在做什么错在这里?它打印出不正确的值。我试着打印出val,而不是打印base2的值是一个。所以它打印像3 7 15 ....我试图将值初始化为ULONG_MAX + 1而不是ULONG_MAX,但它甚至不会进入循环。

任何想法为什么会发生这种情况?

提前致谢!

+0

上的所有信息以二进制已经strored二进制数字电脑格式。使用'strcat'来连续构建一个字符串并不是一个好主意。在添加另一个单个字符后,您如何预期字符串看起来像? – Olaf

+1

'ULONG_MAX'是'unsigned long'可以容纳的**最大**值。你认为'ULONG_MAX + 1'确实如此?使用调试器来遍历代码。至少打印循环中的值。它失败的原因非常明显。 – Olaf

+0

有什么不对。显示测试程序,所以我们也可以运行它。 –

回答

3

您正在初始化val以设置所有位。因此,当您应用&时,除非k已设置所有位,否则比较结果将为false。

您只需要在val中设置一位,并且您需要从最高位开始。所以初始化这样的:

for (val = 1UL << (sizeof(unsigned long)*8-1); val > 0; val >>= 1) { 

然后当你调用它像这样:

printf("binary=%s\n",long_to_binary(0x12345678)); 

你得到这样的:

binary=0000000000000000000000000000000000010010001101000101011001111000 
+0

当您使用幻数时,请至少记录它。我花了10秒才明白,8代表你的意思是CHAR_BIT。 – user3528438