C++ 从64位转换到32位时,Gcc不会给出任何警告

C++ 从64位转换到32位时,Gcc不会给出任何警告,c++,gcc,casting,C++,Gcc,Casting,这是我的代码: int main() { uint64_t a = 100; uint32_t b = a; return 0; } Gcc命令: ~$ gcc -o 1 1.c -Wall ~$ 谁能给我一些帮助吗?使用-Wconversion选项。 -Wconversion 警告可能改变值的隐式转换。这包括实数和整数之间的转换,如x为双精度时的abs(x);有符号和无符号之间的转换,如无符号ui=-1;以及转换为更小的类型,如sqrtf(M_-PI)。对于诸如a

这是我的代码:

int main()
{
    uint64_t a = 100;
    uint32_t b = a;
    return 0;
}
Gcc命令:

~$ gcc -o 1 1.c -Wall
~$
谁能给我一些帮助吗?

使用-Wconversion选项。

-Wconversion 警告可能改变值的隐式转换。这包括实数和整数之间的转换,如x为双精度时的abs(x);有符号和无符号之间的转换,如无符号ui=-1;以及转换为更小的类型,如sqrtf(M_-PI)。对于诸如abs((int)x)和ui=(unsigned)-1之类的显式强制转换,或者如果值没有像abs(2.0)中那样通过转换进行更改,则不要发出警告。使用-Wno sign conversion可以禁用有关有符号整数和无符号整数之间转换的警告

对于C++,还警告用户定义转换的混淆过载解决方案;以及从不使用类型转换运算符的转换:转换为void、相同类型、基类或对它们的引用。在C++中默认情况下禁用关于符号和无符号整数之间的转换的警告,除非明确启用了-WSCONE转换。P> 在您的代码上:


从«uint64{aka long long unsigned int}转换为«uint32{aka unsigned int}»可能会改变其值[-Wconversion]

一个常见的误解是,
-Wall
打开所有警告

它打开了“一些用户认为值得怀疑的结构的警告,这些警告很容易避免(或修改以防止警告),甚至与宏一起引用”(引用GCC手册)。 即使是

-Wextra
也仅“启用了一些-Wall未启用的额外警告标志”(同样来自GCC手册)

还有
-pedantic
,在编译器清楚代码含义的情况下生成警告,但标准要求符合要求的编译器发出消息。(GCC的默认设置是以静默方式继续编译)


即使启用了这三个选项,您也不会得到编译器能够给出的所有警告。查看编译器手册以了解更多详细信息。

如果添加
-O2
?OTOH,编译器可能会看到没有值丢失,因此,这可能不是一个好的示例。为什么要发出警告?从无符号64位到无符号32位的转换是合法的,并且具有定义良好的行为。感谢您的帮助。我试过-Wall-Wconversion-Wextra。但它不起作用。你能提供一些细节吗?@btbsnc:也许是GCC的旧版本?v4.5.3/Cygwin给了我预期的警告,v4.1.2/Linux没有。是的,你是对的!它是4.1.220080704(Red Hat 4.1.2-52),x86_64-redhat-linux。谢谢您的帮助。也许您还应该提及
-Wpedantic
?-Wpedantic无效。我试过-迂腐,但不起作用。@btbsnc:天哪,这些就是我喜欢的报道。你是什么意思,“我试过了
-学究式的
,但没用”?您是否收到错误消息?如果是,消息是什么?结果不符合你的期望吗?如果是,观察到的结果是什么,您的期望是什么?不过,一般来说,我建议您阅读所使用工具的详细手册……从uint64\u t到uint32\u t进行铸造时,我需要一些警告,但什么也没发生。所以“它不起作用”。@btbsnc:利姆斯和我都没有声称它会起作用。ForEveR已经为您提供了案例所需的特定编译器选项。我添加了更一般的建议,即即使是
-Wall-Wextra-pedantic
也不能涵盖编译器可能警告的所有内容,因为我觉得它在本例中是热门话题,因为您显然是在假设它会出现的情况下工作的。请务必阅读有关编译器警告选项的手册。