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

将unsigned char转为unsigned short时,额外字节补零是否有官方保障?

无符号类型扩展的填充规则问题

问题1:unsigned char转unsigned short时,额外字节是否始终零填充?有官方依据吗?

是,这个行为是C标准明确规定的。当把一个无符号整数类型转换为更大的无符号整数类型时,会采用零扩展——新类型的高位字节全部用0填充,和系统大小端无关(大小端影响的是字节在内存中的存储顺序,不影响转换后的数值逻辑)。

C标准的整数转换规则明确:无符号整数转换到宽度更大的无符号整数类型时,原数值会被补零至新类型的位宽,保证转换后的数值和原数值的数学值一致。你本机测试的结果符合这个规定。

问题2:任意低字节无符号类型转高字节无符号类型,结论是否同样成立?

是的,所有无符号整数类型之间的向上转换(从位宽小的到位宽大的),都遵循零扩展规则。不管是unsigned char转unsigned int,还是unsigned short转unsigned long long,只要目标类型是更大的无符号整数类型,高位都会用0填充,这个行为是标准统一规定的,不存在例外。


测试代码(修正后可直接编译运行)

#include<stdio.h>

typedef unsigned short    ub2;
typedef unsigned char  ub1;

// 检查系统大小端
void check_endianness() {
    unsigned int x = 0x12345678;
    char *c = (char *)&x;
            
    if (*c == 0x78) {
        printf("System is Little Endian\n\n");
    } else if (*c == 0x12) {
        printf("System is Big Endian\n\n");
    } else {
        printf("Unknown Endianness\n\n");
    }
}

int main() {
    // 步骤1:检查系统大小端
    check_endianness();
            
    // 用字符串初始化ub1指针
    ub1 *ptr = (ub1 *)"[1,2,";
    // 将第一个字符(ub1)转换为ub2并以十六进制打印
    ub2 casted_value = (ub2) *ptr;
    printf("Original ub1 value: %x\n", *ptr);
    printf("Casted ub2 value: %x\n", casted_value);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 16:50:09