1、正整数的原码、反码、补码完全一样,即符号位固定为0,数值位相同。
2、负整数的符号位固定为1,由原码变为补码时,规则如下:原码符号位1不变,整数的每一位二进制数位求反,得到反码;反码符号位1不变,反码数值位最低位加1,得到补码。
3、例如正整数的原码为01110110,则反码和补码也为01110110;负整数的原码为11110110,反码为10001001,补码为11110111。
:
1、反码是数值存储的一种,多应用于系统环境设置,如linux平台的目录和文件的默认权限的设置umask,就是使用反码原理。在计算机内,定点数有3种表示法:原码、反码和补码。
2、在计算机系统中,数值一律用补码来表示(存储)。 主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补 码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
小数部分这么算,举例来说:0375
将小数部分乘以2得到075,这个结果的整数部分就是转换后的第1位二进制小数[00]
用上步的小数部分继续算:0752=15,现在将整数部分填入二进制小数[001]
052=10,二进制小数为[0011],发现小数部分是0时停止运算,否则可以继续算下去
提示:如果转n进制就乘以n好了,还是保留整数部分,用小数一位一位地算直到小数为0
帮助理解:0375是十进制小数,那么小数点后边第一位就是037510=375的整数部分对吧,继续用小数算,每位都可以出现在整数部分的。c语言中查看小数长度的方法代码如下:
1)如果按%s输入,也就是按字符串格式输入,先找到小数点的位置,然后统计下小数点后数字的长度。
具体实现可参考:
#include
#include
#include
intmain(intargc,charargv[])
{
chara[128];
while(scanf("%s",a)!=EOF)
{
if(strstr(a,"")!=NULL)
printf("%d\n",strlen(strstr(a,"")+1));
else
printf("0\n");
}
system("pause");
return0;
}
2)如果按%f(对应float类型小数)或者%lf(double类型的小数)方式读入,则需要先去掉整数部分,然后看小数部分一直乘10减去整数部分,知道等于0,统计,乘了几次10,但是由于浮点数在计算机中存的并不是准确值,这个往往得不到正确的结果。可以使用sprintf(str,"%g",f);,然后由于f毕竟不是准确值,还是会出现有些问题,源码如下:
#include
#include
#include
intmain(intargc,charargv[])
{
chara[128];
floatf;
while(scanf("%f",&f)!=EOF)
{
sprintf(a,"%g",f);
if(strstr(a,"")!=NULL)
printf("%d\n",strlen(strstr(a,"")+1));
else
printf("0\n");
}
system("pause");
return0;
}
%在c语言中有两种释义,一是求余符号,经常会用到判断一个数是不是能被另一个整除。二是引导符,用于引导输入输出项表列的格式。
在scanf、printf这样的函数中,将参数类型与输入/输出句子中的相应位置相对应所使用的转义标志符。%c单个字符输出的意思;%s是输出字符串;%d是输出整型;%f是输出整型。其中常用的有%c--对应字符型char%s--对应字符串型char(char[])%d--对应整形int%ld--对应长整形long%x--对应十六进制整数,大于9的字母小写%X--对应十六进制整数,大于9的字母大写%u--对应无符号整形unsignedint。
原码:在数值前直接加一符号位的表示法。
例如: 符号位=数值位
[-7]原=1 0000111 B
注意:a 数0的原码有两种形式:
[+0]原=00000000B [-0]原=10000000B
b 8位二进制原码的表示范围:-127~+127
编码方式
原码是有符号数的最简单的编码方式,便于输入输出,但作为代码加减运算时较为复杂。
一个字长为n的机器数能表示不同的数字的个数是固定的2^n个,n=8时2^n=256;用来表示有符号数,数的范围就是 -2^(n-1)-1 ~ 2^(n-1)-1,n=8时,这个范围就是 -127 ~ +127。
但是在不需要考虑数的正负时,就不需要用一位来表示符号位,n位机器数全部用来表示是数值,这时表示数的范围就是0~2^n-1,n=8时这个范围就是0~255。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)