为何GCC将64位值赋值给32位变量时未报错?
问题分析:GCC未警告64位值赋值给32位变量的原因
首先看测试代码:
#include <stdio.h> int main(int argc, char ** argv) { int x; size_t xx = 12345678901234; x = xx; printf("%d %zi %zi\n", x, sizeof(x), sizeof(xx)); }
使用gcc -Wall -pedantic编译时无警告,运行输出1942892530 4 8,原因如下:
-Wall 不覆盖隐式截断转换警告:GCC的
-Wall选项仅开启了大部分常见警告,但从宽类型(64位无符号size_t)向窄类型(32位有符号int)的隐式截断转换,不在它的默认警告覆盖范围内。需手动添加特定警告选项:要触发这类警告,需要额外指定
-Wconversion(覆盖所有隐式转换风险)或-Wsign-conversion(针对有符号/无符号间转换)选项。比如执行gcc -Wall -pedantic -Wconversion test.c,就会得到明确警告:warning: conversion to ‘int’ from ‘size_t’ may alter its value [-Wconversion] x = xx; ^-pedantic 不干预此类转换:
-pedantic的作用是强制GCC严格遵循C标准,但C标准本身允许这种隐式类型转换(仅当值超出目标类型范围时,行为属于未定义),因此它不会触发这个警告。
另外需要注意:你例子里运行得到的截断结果只是当前平台的特定表现,这种超出范围的赋值行为在C标准中属于未定义行为,不同编译器或平台可能有不同结果,绝对不要依赖这种行为。
内容的提问来源于stack exchange,提问作者pm100
相关产品推荐
相关产品推荐

