You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C/C++中窄无符号类型转宽类型时高位置零是否受标准保证?

无符号类型拓宽转换的标准保证

先看你给出的代码示例:

uint8_t a = 0xAB;

// C++写法
uint32_t b = static_cast<uint32_t>(a);

// C写法
uint32_t c = (uint32_t)a;

你的假设完全正确,无论是C还是C++标准,都明确保证从窄无符号类型转换到更宽的无符号类型时,会执行零扩展——也就是转换后的宽类型高位全部补0。

C标准的规定

C标准(比如C17版本的§6.3.1.3条款)明确:当无符号整数转成更大的无符号整数类型时,结果是原数值加上2^k的整数倍,直到落在目标类型的取值范围内。因为原无符号数本身就小于目标类型的最大值,所以直接通过高位补0的零扩展就能得到符合要求的结果,数值和原数完全一致。

C++标准的规定

C标准(比如C20版本的§7.3.9条款)同样明确:无符号整数类型转位数更多的无符号类型时,源值会被零扩展到目标类型的位数,最终结果的数值和原数相等。

拿你代码里的例子来说,a的值是0xAB(二进制10101011),转成uint32_t后,会变成0x000000AB,高位24个比特位全是0,数值保持0xAB不变。

内容的提问来源于stack exchange,提问作者Patrick Wright

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 18:31:01