G ++允许在x64上进行隐式的long-to-int截断

Alp*_*eam 1 c++ g++ overflow integer-overflow

我用g ++ -Wall编译这段代码,得到没有警告/错误:

#include "stdio.h"

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

输出是人们所期望的:

1000000000000 -727379968
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,编译器是否应该阻止隐式转换/截断?

g++ (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42)
Run Code Online (Sandbox Code Playgroud)

Mar*_*k B 7

我相信你正在寻找-Wconversion哪些不包括在内-Wall.我肯定在g ++ 4.4和4.5中得到了警告,但我没有权限测试早期版本.warning: conversion to 'int' from 'long long int' may alter its value(我使用的long long是因为我生成了32位构建,其中long仍为32位).