从论坛内容开始谈技术

本来作为一个学习者是没有资格来谈论技术的,但是最近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();才得出的结论。虽然如此,这却着实让我多想了一点,其实这里已经不仅仅是关于编程的问题了,这已经涉及到计算机系统结构和内存分配的问题了。经过此,我感到了学习一门学科,如果要真正了解他必须要重视它的基础,这是我们理解他的起点。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值