【发布时间】:2015-09-12 00:17:06
【问题描述】:
我想通过应用下面的代码在char 数组中存储十进制数的二进制等价物,但问题是我无法保存十进制数的最后一位。我得到了垃圾值。
int k,j;
char c[40];
j=32;
scanf("%d",&k);
while(k)
{
k=k>>1;
c[j]=k|1;
j--;
}
puts("number is");
puts(c);
【问题讨论】:
-
负值的右移是实现定义的,因此可能会产生意想不到的结果。
-
@Olaf 你能说出一个架构,其中将负值右移 1 会产生意想不到的结果吗?
-
您应该向函数
puts传递一个以空字符结尾的字符数组,而不仅仅是任何字符数组。此函数打印所有字符,直到第一次出现空字符。在您的示例中,只要您有一个等于 0 的二进制数字,就会出现这样的字符。如果不存在这样的数字(即在k == 0xFFFFFFFF的情况下),那么您的程序会产生未定义的行为。在任何情况下,它都不会打印输入数字的二进制表示,因为您将数组中的字符设置为0和1,而不是'0'和'1'。 -
@hyde:有各种 CPU 只提供逻辑(无符号)右移。对于这些,编译器很可能(并且将)不保留符号。注意:我不是向您指出特定的架构,而是您要证明它永远不会发生,因为标准实际上允许。我宁愿依靠(也是 IDB)将
int转换为unsigned,因为 that 不太可能失败。注意:如果您确实 expect 改变符号的值,那宁愿不是“意外”。