·初学者问一个C语言的问题。 C语言初学者 问一个小问题~~

作者&投稿:豆削 (若有异议请与网页底部的电邮联系)
简单地说,一个float型实数在内存中占4个字节,即32个二进制bit,从低位到高位依次叫第0位到第31位.这32位可以分为3个部分:符号位(第31位),阶码(第30位到第23位共8位),尾数(最低23位)。
1、符号位。最高位也就是第31位表示这个实数是正数还是负数,为0表示正数或0,为1表示负数.
2、阶码。第30位到第23位这8个二进制位表示该实数转化为规格化的二进制实数后的指数与127(127即所谓偏移量)之和即所谓阶码.
规格化的二进制实数的指数只能在-127----+127之间,所以,一个float型数的最大值在+2^127即+3.4*10^38,最小值在-2^127即-3.4*10^38.
3、尾数。其他最低的23位即第22位到第0位表示该实数转化为规格化的二进制实数后小数点以后的其余各位即所谓尾数.

例如,将十进制178.125表示成机器内的32个字节的二进制形式.

第一步:将128.125表示成二进制数:(178.125)(十进制数)=(10110010.001)(二进制形式);
第二步:将二进制形式的浮点实数转化为规格化的形式:(小数点向左移动7个二进制位可以得到)
10110010.001=1.0110010001*2^7 因而产生了以下三项:
符号位:该数为正数,故第31位为0,占一个二进制位.
阶码:指数为7,故其阶码为127+7=134=(10000110)(二进制),占从第30到第23共8个二进制位.
尾数为小数点后的部分, 即0110010001.因为尾数共23个二进制位,在后面补13个0,即01100100010000000000000
所以,178.125在内存中的实际表示方式为:
0 10000110 01100100010000000000000

再如,将-0.15625表示成机器内的32个字节的形式.
第一步:将-0.15625表示成二进制形式: (-0.15625)(十进制数)=(-0.00101)(二进制形式);
第二步:将二进制形式的浮点数转化为规格化的形式:(小数点向右移动3个二进制位可以得到)
-0.00101=-1.01*2^(-3) 同样,产生了三项:
符号位:该数为负数,故第31位为1,占一个二进制位;
阶码:指数为-3,故其阶码为127+(-3)=124=01111100,占从第30到第23共8个二进制位;
尾数为小数点后的01,当然后面要补21个0;
所以,-0.15625在内存中的实际表示形式为:
1 01111100 01000000000000000000000

可以通过以下的C程序验证之:

#include<stdio.h>

printfFloatBit(float f) /*功能:从高位到低位依次输出f的32个二进制位*/
{ int i,j;
unsigned int byte=0;
char ch,*p;
p=(char *)(&f); /*将f的地址以char形式赋予p*/
printf("%20.7f: ",f);

for(i=sizeof(float)-1;i>=0;i--) /*每循环一次将f从高到低产生一个字节*/
{
ch=*(p+i);
byte=ch;

for(j=1;j<=8;j++) /*每循环一次将一个字节从高到低产生一个二进制位*/
{ if(byte>=128) printf("1");
else printf("0");
byte<<=1;
byte&=255; /*只保留最低8位,将左移后可能产生的进位舍去*/
}
}

printf("\n");
}

main()
{ float f1=178.125;
float f2=-0.15625;
clrscr();

printfFloatBit(f1);
printfFloatBit(f2);

system("pause");
}

也没有发现问题。
但是我发现如果输出时用%5.2f的格式就可以正确的输出。
也可以把float改为double,这时输入也没有问题。

楼猪
不好意思 我找了很久都没找到
分数给我吧~~~

具体为啥也不清楚 char name[10] 以前我是这样改的 指针的问题吧

一个c语言初学者问个问题~

#include
float(float
f)
//调用函数在main函数前就不用申明,如果在main函数后就要申明
{
float
c;
c=5.0/9*(f-32);
return(c);
}
void
main()
{
float
c,F
;
printf("请输入一个华氏温度:
");
scanf("%f",&f);
c=float(F);
printf("摄氏温度为:
");
printf(".2%f
",c);//.2是格式控制符
}

试下*s-*p

s和p是两个指针.p跟c一样指向数组第一个地址,&c[5]是提取c[5]的地址,其实就等到(c+5),所以s-p输出应该是5

请教一个很简单的c语言问题,我是初学者
答:仅分析第二条语句printf("a%cb%c\bc%c\tabc\n",c1,c2,c3);} 其中a输出a-》“a”,c输出c1也就是a-》“aa”,b输出b-》“aab”,c输出c2也就是b-》“aabb”,\b输出退格,把上一个b擦掉了-》“aab”,c输出c-》“aabc”,c输出c3->"aabcc",\t输出TAB符号,前进八个空格-》...

初学者问一个C语言的问题。
答:两个错误:1. 字符串数组为二维数组,需要用char s[][].2. printf("%s\n",*p)应该为printf("%s\n",p).修改如下:include "stdio.h"int main(){ char s[][10]={"man","woman","girl","boy","sister"};//!!!char *p; int k;for(k=0;k<5;k++){ p=s[k];printf("%s\n"...

C语言初学者,问一个关于数据储存的问题.
答:你没说清楚吧,你说的程序指的是子程序还是整个运行期间的程序。即主程序从执行到退出的期间的程序。如果某个子程序中要保存变量值只需要定义成static int num 就可以了,这样在整个主程序执行的期间里,每次调用该子程序的时候,该变量值不会每次去初始化,而是保留上次子程序执行额结果,知道主程序...

C语言初学者有问题要问!
答:include<stdio.h> int main(){ int i,c;int value=161;for(i=2;i<value;i++){ if(value%i==0){ c=i;} } printf("%d\n",c);return 0;}

一个关于C语言的问题,求教!!
答:但C语言中,“=”是赋值运算符,“==”是关系运算符。如:if (a==3) a=b;前者是进行比较,a是否和3相等,后者表示如果a和3相等,把b值赋给a。由于习惯问题,初学者往往会犯这样的错误。5.忘记加分号。分号是C语句中不可缺少的一部分,语句末尾必须有分号。a=1 b=2 编译时,编译程序在“...

一个简单的c语言问题,求高手给出答案并解释
答:楼主用的是16位的编译器吧,可能是TC 在16位编译器里 int的长度为2个字节,能表示最大整数为 + 2^15 -1 即为32767 该值在内存中二进制表示为 0111 1111 1111 1111 最高位的零为符号位表示整数 再加一后,想符号位进位其他位为零 即1000 0000 0000 0000 或16进制的0x8000 这个数如果用有...

问一个C语言的问题,我是初学者
答:x=m/10;if(x!=0)c(x);这一段表示如果当前位不是最高位则递归。如显示数123 第一次调用后x=12,x不为0;递归一次后x=1,x不为0;再递归一次x=0,表示当前已是最高位1,输出。之后返回上一层输出次高位2,最后输出3。至于将putchar放在if之前是否会逆序输出,楼主可亲自运行一下 希望我...

c语言非常基本问题的疑惑。。一个初学者的烦恼!
答:看了你的问题, 主要在于指针方面,毕竟指针是C的精华, 是要下点功夫才能搞懂!1. 3x^n/(2x-1) 不能写成 3*pow(x,n)*(1/(2x-1)) 因为括号的优先级比*高,它会先算1/(2x-1), 1/(2x-1)要么=0, 要么=1; 所以应写成(3*pow(x,n))/(2x-1)2. 转义字符也占占空间,但只占一...

问一个关于c语言的问题啊 初学者)
答:看来还真是个初学者,建议你多实践 printf("%u\n",sum1) 以无符号十进制整数形式输出sum1的值 printf("%ld\n",sum1) 以长整数形式 d表示有符号十进制整数形式 ld表示以长整型十进制格式 参考下:http://wenku.baidu.com/view/065d62fff705cc1755270989.html ...

C语言编程问题,初学者,不太会,谢谢
答:编写一个函数,删去输入的一维数组中所有相同的数,使之只剩一个。数组中的数已按由小到大的顺序排列,函数返回删除后数组中数据的个数。在主函数输入一个有序数组,接着调用该自定义函数,最后输出删除重复数据后的数组元素。如:输入的数组元素为:999866000-2-2打印的结果为:9860-2 这个程序的实现...