本來作為一個學習者是沒有資格來談論技術的,但是最近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();才得出的結論。雖然如此,這卻著實讓我多想了一點,其實這裡已經不僅僅是關於編程的問題了,這已經涉及到電腦系統結構和記憶體配置的問題了。經過此,我感到了學習一門學科,如果要真正瞭解他必須要重視它的基礎,這是我們理解他的起點。