标签:基础 ... 方式 程序 字节 gcc编译 读取 编译器 code
1 int main() 2 { 3 float a =765; 4 a++; 5 printf("%d\n", a); 6 system("pause"); 7 return 0; 8 } 9 //为什么会输出是0? 10 解释如下: 11 在printf时,float 会自动转换成double型,由32位变到64位。%d输出的是最低的32位。 12 电脑是小端模式,故保存765时,是以下格式 13 栈底(高字节).................栈顶(低字节) 14 765 0000 15 下面引申一道题 16 int main(){ 17 int a;float b,c; 18 scanf("%2d%3f%4f",&a,&b,&c); 19 printf("\na=%d,b=%d,c=%f\n",a,b,c); 20 } 21 若运行时从键盘上输入9876543210l,则上面程序在gcc编译器下的输出结果是a=98,b=0,c=0.000000 22 解析: 23 printf时,float会自动转换为double型,因此变量b 和 变量c 从32位转64位; 24 b是以%d 的格式进行输出,因而输出的是最低的32位。 25 电脑是小端模式--高字节高地址,低字节低地址 26 printf压入栈的顺序是从右到左,因而先压C,再B,再A; 27 栈底(高字节).................栈顶(低字节) 28 4321 0000 765 0000 98 29 4字节 4字节 4字节 4字节 4字节 30 从低字节开始进行输出, 31 首先输出a, 四个字节,即98 32 然后输出b, 四个字节,即0 33 然后输出c,八个字节,是正常方式打印,会一下子读取八个字节,正好前四个字节全是0。由于浮点数存储的方式, 34 64位里面包括了1符号位,11阶数,52尾数,阶数是0,表示-1023 + 1023 = 0,用指数表示:1.#*2^-1023, 35 ‘#’是代表尾数。尾数是000。。。后面数字但很小,所以这个浮点数是非常小的。 这道题可以说是b的输出方式影响 36 了C,如果b用%f输出,那么b和c都会显示正确
标签:基础 ... 方式 程序 字节 gcc编译 读取 编译器 code
原文地址:http://www.cnblogs.com/maleyang/p/7400560.html