C语言 两题
main()
{ int a,b,c;
a=20;
b=027;
c=0x3F;
printf("%d,%d,%d\n",a,b,c);
printf("%o,%o,%o\n",a,b,c);
printf("%x,%x,%x\n",a,b,c);
}
为什么运行结果为
20,23,63
24,27,77
14,17,3f
#include "stdio.h"
void main()
{
float x=12345.54321;
double y=445566778899.987654321;
printf("%f\n",x);
printf("%f\n",y);
}
为什么运行结果为
12345.542969
445566778899.987670
请清楚的解释一下。。 谢谢 展开
a=20; b=027; c=0x3F;中以0开头的是八进制,以0x开头的是十六进制。那么a、b、c的三种进制分别如下:
变量 十进制值 八进制值 十六进制值
a 20 24 14
b 23 27 17
c 63 77 3f
printf中的控制符:%d表示以十进制形式输出;%o表示以八进制形式输出;%x表示以十六进制形式输出。
对照上述规则:
第一行printf("%d,%d,%d\n",a,b,c);是以十进制形式输出a、b、c,所以是20,23,63;
第二行printf("%o,%o,%o\n",a,b,c);是以八进制形式输出a、b、c,所以是24,27,77;
第三行printf("%x,%x,%x\n",a,b,c);是以十六进制形式输出a、b、c,所以是14,17,3f。
2.float型用32位二进制表示,有效的十进制数约6~7位,而控制符%f默认输出小数点后6位,所以,
float x=12345.54321;中的最后三位321并没有赋值给x,因为放不下了;但输出时又要输出6位小数,输出最后3位就是“随机”填上的——这里的“随机”并非时间随机,而是一台机器与另一台机器可能不一样,一套软件可能与另一套软件不一样,而在同一台机器、同一个软件平台下次次运行都是一样的。
double的情况与float的情况完全一个道理。只是double是64位二进制,能表示16~17位有效的十进制数!
辛苦你了,懂了,谢谢!~
定义a的时候值为20,20的八进制表示方式为24,,十六进制表示为14
定义b的时候值为027,这是一个8进制表示,因为有前导0,所以b的十进制值为23,八进制为27,十六进制为17
定义c的时候是0x3F,这是16进制的表示,因为有前导0x,所以c的十进制为63,八进制为77,十六进制为3f
在打印的时候,用的是小x,所以f是小写。
第二个题:
浮点型和双精度浮点型在内存中保存都是有一定误差的,默认打印的时候保留6位有效数字。
所以,虽然定义的时候是12345.54321,但是进入内存再读出来,可能就是不一精确的了。
double也是一样,默认打印输出的时候,保留6位小数。
所以由于这个特性,两个浮点变量不能直接用等号判断相等,而是要用一个区间。
第一题不懂c那一步。。第二题的答案是不确定的么?
c这个变量定义的时候,用的是0x3F,所以告诉编译器,这是一个16进制的值。无论是多少进制,最后计算机都会转化成二进制存储的。那么打印这个二进制的时候,用%d就是十进制打出来,用%o就是8进制打出来,而用%x就是用小写abcdef的十六进制打出来。
第二个题答案和编译器和系统有关,输出结果在不同机器上可能相同,可能不同,但是标准规定,小数后面要保留6位有效数字。
2014-02-08
o代表八进制整数
x代表十六进制整数
第一题
第二题 第一个 单精度浮点数 也就是 float 最多只有7个有效数字 所以小数点后最多六位 多的爆掉
f代表浮点数整数 小数点后只带六位 所以原本是double数按单精度输出只有六位
请问 c=0x3F 怎么转换成八进制??不知道F要怎么处理
不对 c=0x3F 和 c=63是一样 只是这是一种16进制赋值法
你这时候可以用cout<<c试试看就知道了
至于他的转换 其实是在printf哪里 printf 可以改变整数输出的方式
同样一个整数 用printf("%d", 和 %o 就是两种输出方式
2014-02-08