【发布时间】:2021-11-30 04:21:30
【问题描述】:
#include <stdio.h>
wchar_t wc = L' 459';
printf("%d", wc); //result : 32
我知道 ASCII 码表中的“空格”是“十进制 32”。
我不明白的是,据我所知,如果变量没有足够的空间来存储值,则该值将是原始值的“最后一位”。
例如,如果我将二进制值“1100 1001 0011 0110”放入单字节变量中,它将是“0011 0110”,即原始二进制值的“最后一个字节”。
但上面的代码显示了原始值的“第一个字节”。
我想知道当我执行上面的代码时内存级别发生了什么。
【问题讨论】:
-
根据 C 规范,"包含多个多字节字符或映射到扩展执行字符集的多个成员的单个多字节字符的宽字符常量的值,或包含未在扩展执行字符集中表示的多字节字符或转义序列是实现定义的。"
-
例如,微软的 MSVC (cl) 和 GNU GCC (gcc) 将
wc设置为不同的值。 MSVC 将其设置为L' ',GCC 将其设置为L'9'。如果您将警告级别设置得足够高,两个编译器都会发出有关截断的警告。 -
wchar_t在 Linux 中为 4 个字节,在 Windows 中为 2 个字节。无论哪种方式wchar_t wc = L' 459'都无效。描述您在使用什么系统以及您的目标是什么。 -
@Barmak Shemirani 它在 VS2019 上运行时没有任何警告。我的目标是“了解它在内存级别上的真正运作方式”。据我所知,我的代码没有问题,因为 'wchar_t' 在 VS 中是 'unsigened short' 的 typedef 并且字符字面前缀 'L' 表示值是 'wchar_t type' 所以我看不到任何我的代码有问题。