無論在c中還是c++中(c用的是gcc編譯器,c++用的是g++編譯器),如果在a檔案中定義了乙個函式func,其返回值為float。而在b的檔案中宣告為了int func,那麼在b中使用func計算的結果並不是有float自動型別轉化為int的值,而是乙個錯誤的值。具體見下面的**:
a.c
#includefloat func(int a, int b)
b.c
#includeint func(int a ,int b);
int main()
執行 gcc a.c b.c -o test.out 後 ./test.out
結果為a:2
b:4如此可見用int解讀的返回值是8,而不是4。說明為發生型別轉化。
推辭編譯器是這樣操作的,在呼叫a.c中的func函式時,運算結束後申請了乙個4個位元組的臨時空間用於存放返回值,並交給b.c檔案處理。但是b.c卻是按照int進行解讀的。
由於float是浮點儲存
4.5在float中的儲存分析如下:
4.5 = 100.1 = 1.001*2^(2)
所以符號位是0,指數字為127+2=129 = 0111 1111 + 0000 0010 = 1000 0001;
尾數字為0010 0000 0000 0000 0000 000 (注意float型別把小數點前的1給隱藏了,double中應是1001)
所以:每8個寫一塊兒是 0100 0000 1001 0000 0000 0000 0000 0000
由於gcc是小端儲存,所以其內部儲存從低位址到高位址應該是 0000 0000 0000 0000 1001 0000 0100 0000
**驗證如下
#includeint main(void)
執行 gcc a.c b.c -o test.out 後 ./test.out
結果為a:2
b:42147483647
11結果卻變為了11,不是8了。
具體原因不明,帶以後解答。。。。
C 函式返回值。
一 params.可變引數,無論有幾個引數,必須出現在引數列表的最後,可以為可變引數直接傳遞乙個對應型別的陣列。class program test msg intarry static void test string msg,params int args 二 ref 引用傳遞 三 out ou...
C 函式返回值與引用
對於函式的返回值,看似簡單,但並非如此,比如 int func int a 該函式會返回乙個int型,如果進行乙個呼叫int result func 3 會發生什麼情況?首先,func將返回值複製到乙個匿名臨時變數中,在這裡假設該臨時變數為anony 其實是沒有名字的,這裡方便闡述 然後,再將ano...
c 函式返回值與引用
對於函式的返回值,看似簡單,但並非如此,比如 int func int a 該函式會返回乙個int型,如果進行乙個呼叫int result func 3 會發生什麼情況?首先,func將返回值複製到乙個匿名臨時變數中,在這裡假設該臨時變數為anony 其實是沒有名字的,這裡方便闡述 然後,再將ano...