C和C 函式定義與宣告的返回值型別不一樣時

2021-08-20 03:40:52 字數 1058 閱讀 2231

無論在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...