如果我将操作数1和操作数2用作整数,则我的代码有效。使用unsigned char操作数1不起作用。你能救我吗?
int ALU(unsigned char operand1, unsigned char operand2)
{
printf("Enter Operand 1(in decimal): ");
scanf("%d",&operand1);
printf("\nEnter Operand 2(in decimal): ");
scanf("%d",&operand2);
char bin16_1[] = "0000000000000000";
int pos;
for (pos = 16; pos >= 0; --pos)
{
if (operand1 % 2)
bin16_1[pos] = '1';
operand1 /= 2;
}
printf("\n\nBinary Equivalence of Operand 1: %s",bin16_1);
如果输入4096或512或65536作为十进制,输出将为0000 0000 0000 00000,这是错误的。
答案 0 :(得分:1)
char *reverse(char *str)
{
size_t len = strlen(str);
for (size_t pos = 0; pos < len / 2; pos++)
{
char tmp = str[pos];
str[pos] = str[len - 1 - pos];
str[len - 1 - pos] = tmp;
}
return str;
}
char *toBin(char *buff, uint16_t value, int pad)
{
size_t nbits = 16;
char *work_buff = buff;
do
{
*work_buff++ = value & 1 ? '1' : '0';
value >>= 1;
nbits--;
}while(value);
if (pad)
{
while (nbits--)
{
*work_buff++ = '0';
}
}
*work_buff = 0;
return reverse(buff);
}
答案 1 :(得分:-1)
您的解决方案不起作用,因为您无法对未签名的字符执行此类操作。您应用的算术运算在带有十进制基数的数字上,但是无符号字符属于二进制数。
因此,不应检查模数并将输入除以2,而应该在当前最重要的位和1.代码之间执行移位和二进制比较:
正确的解决方案:
for( int i = 7; i >= 0; i-- ) {
bin16_1[i] = (operand1 >> i) & 1 ? 1 : 0;
}
<强>解释强>
每次迭代时,通过移位和二进制比较,从字节读取最高有效位。
例如,假设输入值为128,二进制转换为1000 0000.将其移动7将给出0000 0001,因此得出结论:最高有效位为1. 0000 0001&amp; 1 = 1.这是在控制台中打印的第一个位。下一次迭代将导致0 ... 0。