從論壇內容開始談技術

來源:互聯網
上載者:User

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.