1.负数二进制的表示方法
假设有一个 int 类型的数值为5,那么,我们知道它在计算机中表示为:
00000000 00000000 00000000 00000101
5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。
原码:正数的原码按照绝对值大小转换成的二进制数;负数的原码按照绝对值大小转换成的二进制数,然后最高位补1,称为负数的原码。
反码:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。
补码:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.
比如-1的原码:10000000 00000000 00000000 00000001
反码: 11111111 11111111 11111111 11111110(除符号位按位取反)
补码: 11111111 11111111 11111111 11111111
可见,-1在计算机里用二进制表达就是全1。16进制为:0xFFFFFF
正零和负零的补码相同,[+0]补=[-0]补=0000 0000B
2.C语言中怎么把一个十进制的负数以二进制的形式输出
#include<stdio.h>
void prt_byte( int n )
{
if ( n>1 )
prt_byte(n/2);
printf("%d", n%2 );
}
void main()
{
int n=-100;
if ( n<0 )
{
printf("-");
n=-n;
}
prt_byte(n);
printf("\n");
}
3.小数的二进制算法
小数的二进制算法就是 取小数位然后乘2取整
#include <stdio.h>
#include<string.h>
char*GetErJinZhi(floatnumber,charchars[40]);
intmain()
{
charchars[40];
GetErJinZhi(1.25,chars);
}
char*GetErJinZhi(floatnumber,charchars[40])
{
inti,n=1,index=0,tmpnum=0,number1;
floatnumber2;
char chars2[8];
chars[31]='\0';
chars2[7]='\0';
number1=(int)number;
number2=number-(int)number;
for(i=0;i<31;i++)
{
chars[31-1-i]=(number1&n)==0?'0':'1';
n<<=1;
}
do
{
number2=number2-(int)number2;
number2*=2;
chars2[index++]=(int)number2+48;
}while((number2- (int)number2)&&index<7);
chars2[index]='\0';
printf("%s\n",chars2);
strcat(chars,".");
printf("%s",strcat(chars,chars2));
returnchars;
}