在此link unsigned wchar_t
中typedef
为WCHAR
。但我无法在我的SDK winnt.h
或mingw winnt.h
中找到这种typedef。
wchar_t
已签名或未签名?
我在C语言中使用WINAPI。
答案 0 :(得分:11)
wchar_t
的签名未指定。标准只说(3.9.1 / 5):
类型
wchar_t
应具有与其他整数类型相同的大小,符号和对齐要求(3.11),称为基础类型。
(相比之下,char16_t
和char32_t
类型明确无符号。)
答案 1 :(得分:1)
请注意,平台的类型长度会有所不同。
Windows使用UTF-16,wchar_t为2个字节。 Linux使用4字节的wchar_t。
答案 2 :(得分:0)
我刚刚在多个平台上进行了测试,但没有进行优化。
1) MinGW (32-bit) + gcc 3.4.4:
---- snip ----
#include<stdio.h>
#include<wchar.h>
const wchar_t BOM = 0xFEFF;
int main(void)
{
int c = BOM;
printf("0x%08X\n", c+0x1000);
return 0;
}
---- snip ----
它打印0x00010EFF
。 wchar_t
未签名。
相应的汇编代码为movzwl _BOM, %eax
。不是movSwl
,而是movZwl
。
2) FreeBSD 11.2 (64-bit) + clang 6.0.0:
---- snip ----
#include<stdio.h>
#include<wchar.h>
const wchar_t INVERTED_BOM = 0xFFFE0000;
int main(void)
{
long long c = INVERTED_BOM;
printf("0x%016llX\n", c+0x10000000LL);
return 0;
}
---- snip ----
它打印0x000000000EFF0000
。 wchar_t
已签名。
对应的汇编代码说movq $-131072, -16(%rbp)
。 32位的0xFFFE0000
被提升为64位带符号的-131072
。
3)在RedHat(未知版本)+ gcc 4.4.7上,与2)相同的代码:再次打印0x000000000EFF0000
。 wchar_t
已签名。
我既未测试printf
的实现,也未测试WinAPI的WCHAR
定义,但未测试编译器内置的wchar_t
类型(在任何头文件上均未指定其签名)和C的行为。 -to-ASM编译器引擎。
请注意,1)和3)的编译器由同一供应商提供,即GNU工程。答案肯定取决于平台。 (有人会在Visual C ++上进行测试吗?)