2014-11-25 62 views
1

我編譯下面的C代碼:打印負INT只要產生錯誤的結果

#include <stdio.h> 

int main() 
{ 
    int nEndIndex = -1; 
    printf("nEndIndex : %ld\n", nEndIndex); 
    return 0; 
} 

我用GCC 4.2.4編譯它,如下所示:

[[email protected] ~/junk]$ gcc -o test test.c 
[[email protected] ~/junk]$ ./test 
nEndIndex : 4294967295 
[[email protected] ~/junk]$ gcc --version 
gcc (GCC) 4.2.4 
Copyright (C) 2007 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

,因爲我想long大於int使用%ld應該不成問題。因爲他們都是signed爲什麼我得到這個輸出?

+0

它爲我打印-1。 gcc版本4.6.3 – 2014-11-25 04:46:16

+0

@RaghuSrikanthReddy:只有運氣。行爲是未定義的。 – 2014-11-25 04:51:04

回答

5

參數的類型(在升級之後,在這種情況下不適用)必須匹配格式字符串的預期類型;否則行爲是不確定的。

int傳遞給期望long int的函數通常是允許的,並且會導致隱式轉換。但對於像printf這樣的可變參數函數,編譯器不知道將參數轉換爲什麼類型。

行爲是不確定的,這意味着可以發生任何事情(包括,如果你是不幸,代碼似乎工作「正確」)。在實踐中,我們假設int是32位,long是64位(這些大小因系統而異)。 printf可能會從堆棧中獲取64位數據,從您的參數中獲取32位數據和另外32位垃圾;它會打印該數據假設它是一個long int對象(因爲這是你通過格式字符串告訴的)。

對於int參數使用%d,對於long int參數使用%ld

+0

我知道我應該使用'%d'這只是我期望'long int'能夠完美地與'int'一起工作 – 2014-11-25 04:51:23

+0

@KartikAnand:你爲什麼期待? – 2014-11-25 04:52:08

+0

那麼因爲'long int'大於'int',所以不應該有任何問題。正如我們預計'unsigned long'與'void *'一起工作,因爲它具有相同的寬度。 – 2014-11-25 04:53:48

0

該變量未被聲明爲long int。聲明應該是long int nEndIndex = -1;

+0

*或*'printf'格式應該是'%d'而不是'%ld'。 – 2014-11-25 05:13:48