向参数为uint64_t的函数传递uint32_t是否安全?
向uint64_t参数的函数传递uint32_t的相关问题解答
先看示例代码:
void MyFunction(uint64_t arg) {} int main(void) { uint32_t xyz = 1u; MyFunction(xyz); }
针对问题逐一解答:
1. 是否被C标准明确允许?
是,C标准(如C17/C23的6.3.1.3条款)明确允许该操作。调用函数时,参数会触发隐式转换:当无符号源类型(uint32_t)的秩低于目标类型(uint64_t)时,源值会被转换为目标类型,转换方式为高位补0,结果与原数值完全一致,属于标准定义的明确行为,所有合规编译器都必须支持。
2. 是否安全?
完全安全。uint32_t的所有可能取值都能被uint64_t精确表示——无符号整数从小类型转大类型时,仅在高位填充0,不会出现溢出、截断或值失真的情况,也不会产生任何未定义行为。无论传递的是何种uint32_t值,转换后的uint64_t值和原数值在数学上完全等价。
3. MISRA-C对此有何规定?
以MISRA-C:2012为例:
- 规则10.1禁止表达式被隐式转换为不同底层类型,但值保留的无符号整数向更大无符号整数类型的转换属于例外情况,这种安全的隐式转换是被允许的。
- 这类转换符合MISRA的代码安全要求,不存在值丢失、溢出或未定义行为的风险,不会触发MISRA违规警告。
内容的提问来源于stack exchange,提问作者fsdfsdfsdfsdfsdf
相关产品推荐
相关产品推荐

