我不能将负十进制写入二进制c代码。 需要帮忙 :) 这是我的代码...... 没有必要包括其他内容。
#include <stdio.h>
int main(void){
int i;
int j;
int b[16];
printf("input number");
scanf("%d",&i);
if(i <= 0) {
// here is negative decimal code
} else {
for(j=15;j>=0;j--) {
b[j] = i % 2;
i = i / 2;
}
for (j=0;j<=15;j++)
printf("%d", b[j]);
printf("\n");
}
return 0;
}
答案 0 :(得分:2)
只需将整数视为unsigned
,然后输出位。
您将获得负数的内部表示位(通常为2的补码)。无需单独处理负数。
此外,对于许多初学者来说,这似乎很难理解,i
中的数字不是“十进制”。它是通过读取一串十进制数字来初始化的,但底层的计算机内存可能正在使用二进制表示来存储它。
实际数字是相同的:例如23 10 = 10111 2 意味着两个实体是相同的,它们是相同的。查看特定基数中的数字不会改变数字。
答案 1 :(得分:2)
您可以使用bitshift运算符来获取位。
#include <stdio.h>
int main(void){
int i = 0;
unsigned int u_i = 0;
int j = 0;
int b[16] = {0}; //Assuming your integer size is 16bit
printf("input number");
scanf("%d",&i);
u_i = (unsigned int)i;
for(j=15;j>=0;j--) {
b[j] = u_i & 0x1;
u_i = u_i >> 1;
}
for (j=0;j<=15;j++)
printf("%d", b[j]);
printf("\n");
return 0;
}
答案 2 :(得分:1)
要将有符号整数打印为二进制,请执行重复除以2.无需假设宽度为16,也不使用2的补码。使用>>
轮班会邀请实施定义的行为。
#include <stdio.h>
#include <stdbool.h>
void print2_helper(int x) {
bool isodd = x%2;
x /= 2;
if (x) print2_helper(x);
putchar('0' + isodd);
}
void print2(int x) {
printf("Decimal:%d\tBinary:", x);
if (x < 0) putchar('-');
print2_helper(x);
putchar('\n');
}
int main(void){
print2(0);
print2(1);
print2(-1);
print2(2);
print2(-2);
print2(INT_MAX);
print2(INT_MIN);
return 0;
}
输出
Decimal:0 Binary:0
Decimal:1 Binary:1
Decimal:-1 Binary:-1
Decimal:2 Binary:10
Decimal:-2 Binary:-10
Decimal:2147483647 Binary:1111111111111111111111111111111
Decimal:-2147483648 Binary:-10000000000000000000000000000000