思路
使用循环使整数左移i位,并取最高位,如果当前最高位为1则值为'1',否则为'0'。这样拼接出一个字符串。
注意:计算机中存储的是数字的补码。
关于正、负数的原码、反码、补码。
正数:原码、反码、补码都一样。
负数:反码(除了最高位,其它位取反)补码(反码+1)
为什么要存储补码,而不是原码?
为了统一运算方法。使用补码对有符号整数进行加、减不需要关心符号位。
例如:1 + (-2) = -1
-2的原码
1000 0000 0000 0000 0000 0000 0000 0010
-2的反码
1111 1111 1111 1111 1111 1111 1111 1101
-2的补码
1111 1111 1111 1111 1111 1111 1111 1110
计算过程:
0000 0000 0000 0000 0000 0000 0000 0001
+ 1111 1111 1111 1111 1111 1111 1111 1110
= 1111 1111 1111 1111 1111 1111 1111 1111
-1的补码:1111 1111 1111 1111 1111 1111 1111 1111
如果使用原码:1.判断数字的符号位。2.取被加/减数的绝对值 3.加上/减去绝对值
代码
#include
#include
const int INT_SIZE = sizeof(int)*8; // int类型整数的位数
const int MAX_HEIGHT_FLAG = 1 << (INT_SIZE - 1); // 用于取最高位
// 取一个整数的二进制形式字符串,参数一为该整数,参数二为字符串数组首地址
void Int2Binary(int num, char* str){
// 如果是负数,需要先求出原码
if (num<0)
{
// 计算机中存储的是数字的补码(取反+1)
num = ~(num - 1 ); //求原码(-1,取反)
num |= MAX_HEIGHT_FLAG; //负数最高位为1
}
// 每次循环使数字左移i位,并取最高位
char val = 0;
for (int i=1; i<=INT_SIZE; ++i)
{
val = MAX_HEIGHT_FLAG&num << (i-1) ? '1' : '0'; //左移并取最高位,如果当前最高位为1则val值为'1',否则为'0'
str[i-1] = val;
printf("%c", val);
if (i%4==0)
{
printf(" ");
}
}
str[INT_SIZE] = 0; //结束符
printf("\n");
}
// 输入任意位数int整数,打印内存的二进制存储。
void main(){
int num = 0;
while (1){
scanf_s("%d", &num);
char str[INT_SIZE + 1];
Int2Binary(num, str);
printf("num=%d binary=%s \n", num, str);
}
system("pause");
}