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
相关产品推荐
相关产品推荐

