本来作为一个学习者是没有资格来谈论技术的,但是最近CSDN论坛C语言里的两个提问让我对技术有些感慨。于是想把这些记录下来。供大家分享。对此,我很多的我只是提出了自己在这其中遇到的问题,由于自己没有能够完全将其解决,故没有给出结果,希望能够通过此来与大家共同探讨。
先看看下面的这一句代码:
printf("%f",10/3);
请问它的大案是多少?我们不必去猜测了,只要我们把它运过就应该知道在Windows环境下的结果是
0.0000000
为什么是这么一个结果,对这一点说实话我到现在还没有弄清楚。不过我们却可以透过它来学到一些其他的东西。下面有一些就上面一句代码我进行了扩展,如下:
#include<stdio.h>
int main()
{
int a=10/3;
double b=(double)a;
printf("%u/n",&a);
printf("%u/n",&b);
printf("%d/n",sizeof(int));
printf("%d/n",sizeof(double));
printf("%f/n",a);
printf("%f/n",b);
getchar();
return 0;
}
我们看看它的结果(Dev-C++环境编译):
0X2293620
0X2293608
4
8
0.0000000
3.0000000
这个结果让我们发现对数据的存储有个问题,a从0X2293620这个地址开始分配,然而存在一个问题对b变量并未紧接着a分配。中间的空闲空间在做什么?我没有研究出来,但是我想这应该与最开始的那个的到地0.0000000有关吧。至于具体是怎么一回事我想还是需要认证研究了。
对于上面的程序还有个问题:为什么默认情况下输出的浮点型数据都是8位。这个问题我不得其解。
下面再看一个程序:
int main()
{
int a=1;
int b=2;
int array[2]={3,4};
array[-2]=5;
array[-1]=6;
printf("%d,%d",a,b);
return 0;
}
对这个问题我想,就没有必要给出答案了吧。这里我先贴出我在论坛中对这个题的回复(仅个人观点):
对Windows系统无论怎么改变a=1,b=2是不会变化的。这个与内存分配有关。对于本题定义的数据,先定义的数据被分配在高位地址,即a的内存地址比b的内存地址数值大,而对数组的内存分配是在紧接着比b地址低的地方开始分配,但是由于对windows系统采用的是定义的数据为小端存储方式,所以有数组存储有array[0]的内存地址比array[1]的内存地址小,以此原理则有地址大小排序为:&array[-2] <&array[-1] <&array[0] <&array[1].这样array[-1]和array[-2]无论怎样也不会改变a,b变量中存储的值。
就是这段回复,是我通过了很多个printf();才得出的结论。虽然如此,这却着实让我多想了一点,其实这里已经不仅仅是关于编程的问题了,这已经涉及到计算机系统结构和内存分配的问题了。经过此,我感到了学习一门学科,如果要真正了解他必须要重视它的基础,这是我们理解他的起点。