2013-08-30 51 views
1

我編譯此代碼使用g ++ -Wall,沒有得到警告/錯誤:G ++允許隱長到INT截斷在x64

#include "stdio.h" 

int main() { 
     long x = 1000000000000; 
     int y = x; 
     printf("%ld %d\n", x, y); 
     return 0; 
} 

輸出是什麼人會想到:

1000000000000 -727379968 

但是,在這種情況下編譯器是否應該避免隱式轉換/截斷?

g++ (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42) 
+1

*防止*它?怎麼樣*警告你呢? (你確實打開了警告,對嗎?它說你有,但沒有發出警報,甚至沒有「潛在的數據丟失」類型的警告?) – WhozCraig

+0

這是正確的。我嘗試使用-WConversion我剛剛在這裏找到:http://stackoverflow.com/questions/5263267/why-does-c-allows-implicit-conversion-from-int-to- unsigned-int,但代碼仍然靜默編譯。 – AlphaStream

+0

奇怪。現在我必須在我的叮噹中試試這個。你的海灣合作委員會比泥土更古老,但我有些收回這樣的東西沒有被捕獲。編輯:叮噹立即抓住「隱式轉換失去整數精度」。只是fyi。 – WhozCraig

回答

7

我相信你正在尋找-Wconversion這是不包含在-Wall。我肯定在g ++ 4.4和4.5中得到了警告,但我沒有權限測試早期版本。 warning: conversion to 'int' from 'long long int' may alter its value(我用long long,因爲我正在生成一個32位版本,其中long仍然是3​​2位)。

+1

+1這將解釋它。我從來不知道這不在--Wall中。很高興知道,Mark。謝謝! – WhozCraig

+0

仍然沒有運氣: '$ g ++ overflow.cpp -Wall -Wconversion && ./a.out 1000000000000 -727379968' – AlphaStream

+0

或者,這看起來好像與我之前建立的舊版泥濘編譯器,比如之前提到的WhozCraig 。謝謝Mark B! – AlphaStream