为什么char与wchar_t使用多字符字面量赋值时输出结果不一致?
C代码多字符常量与宽字符输出差异原因解析
- 普通单引号包裹多个字符时属于多字符字符常量,其值为实现定义行为,赋值给短宽度类型时会发生截断
- 带
L前缀的宽字符多字符常量值同样由编译器实现定义,且你所用的printf格式符与wchar_t类型不匹配,属于未定义行为,最终输出结果和你的编译器实现强相关
1. 第一组输出(wc = ' 459'; 后的两次打印)
wchar_t wc = ' 459'; printf("%d", wc); // 输出13625 printf("%c", wc); // 输出9
这里' 459'是普通多字符字符常量,类型为int,在常见的小端序编译器实现中,4个字符(空格、'4'、'5'、'9')对应的ASCII值会按顺序存储为int的4个字节,最终整个int值为0x20343539(0x20是空格ASCII值、0x34是'4'、0x35是'5'、0x39是'9')。
你所用环境的wchar_t为16位宽度,赋值时会截断int的低16位,得到0x3539,转换为十进制就是13625,对应第一个%d的输出。%c格式符只会读取参数的低8位,0x3539的低8位为0x39,对应ASCII字符'9',所以第二个输出为9。
2. 第二组输出(wc = L' 459'; 后的两次打印)
wc = L' 459'; printf("%d", wc); // 输出32 printf("%c", wc); // 输出空格
带L前缀的是宽字符常量,当宽字符常量包含多个字符时,主流编译器的实现是直接取第一个字符的宽字符值作为常量值。这里第一个字符是空格,宽字符值对应ASCII的32,所以wc最终值为32,对应%d的输出32。%c读取低8位得到0x20,对应ASCII空格字符,所以最后一个输出为空格。
额外注意
你的代码中用%d、%c输出wchar_t类型属于格式符不匹配,是C标准规定的未定义行为,这里的结果只是你当前编译器的特定实现,换编译环境可能得到完全不同的输出。如果要正确打印宽字符,应该使用%lc格式符,且需要注意区域设置的影响。
内容的提问来源于stack exchange,提问作者GamerCoder
相关产品推荐
相关产品推荐

