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

为何将int赋值给char后printf未丢失数据?C语言技术问询

问题原因分析

这是两个关键C语言机制共同作用的结果:char的符号性和整型提升规则,具体拆解如下:

  • char的默认符号属性
    绝大多数编译器里,char默认是有符号类型(signed char)。你定义的int x = 0xffffffff,在32位int环境下其实是-1的补码表示。把它赋值给1字节的char y时,只会保留低8位,也就是0xff——而对于signed char来说,0xff正好是-1的补码。

  • 函数调用时的整型提升
    当你把char类型的y传给printf时,C语言会触发整型提升:所有小于int的整型类型(比如char、short)都会被提升为int。因为y是signed char且值为-1,提升时会进行符号扩展——把最高位的符号位(1)填充到int的所有高位,这样1字节的0xff就变成了4字节的0xffffffff(对应int类型的-1)。

  • printf的%x格式符行为
    %x是用来输出无符号十六进制整数的,它会把传入的int值0xffffffff当成无符号数处理,自然就输出了ffffffff。

解决办法

如果想得到预期的ff输出,有两种常用方式:

  1. 强制转换为unsigned char后再传入printf:
#include <stdio.h>

int main(void) {
    int x = 0xffffffff;
    char y = x;
    printf("%x\n", (unsigned char)y); // 强制转换为无符号char,避免符号扩展

    return 0;
}
  1. 显式声明y为unsigned char:
#include <stdio.h>

int main(void) {
    int x = 0xffffffff;
    unsigned char y = x; // 直接用无符号char存储
    printf("%x\n", y);

    return 0;
}

这两种方式都会让整型提升时进行零扩展(高位补0),最终传入printf的是0x000000ff,用%x输出就会得到ff。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:32:05