unsigned wchar_t
被 typedef
为 WCHAR
。但我在我的 SDK winnt.h
或 mingw winnt.h
中找不到这种类型定义。
wchar_t
是有符号的还是无符号的?我正在使用 C 语言中的 WINAPIs。
wchar_t
的有无符号是未指定的。标准只说明(3.9.1/5):
类型
wchar_t
应该和其他整数类型中的一个被称为底层类型的类型具有相同的大小、符号和对齐要求(3.11)。
(相比之下,类型char16_t
和char32_t
明确为无符号。)
winapi
的标签,所以我认为这额外的信息仍然是有用的。 - netcoder请注意,类型在不同平台上的长度会有所变化。
Windows 使用 UTF-16 编码,wchar_t 占用 2 个字节。Linux 则使用 4 个字节的 wchar_t。
wchar_t
是一个32位类型,可能用于UTF-32数据。 - jamesdlinchar
的作用。32位的wchar_t
对于需要固定宽度编码的UTF-32非常有用。 - jamesdlinwchar_t
是有符号的还是无符号的,但是Microsoft会这样做。即使你的非Microsoft编译器不同意,Windows API也将使用来自/Zc:wchar_t (wchar_t Is Native Type)的定义:
Microsoft将
wchar_t
实现为两个字节的无符号值。它映射到Microsoft特定的本机类型__wchar_t
。
在编程中,应该使用WCHAR而不是wchar_t。MSDN对WCHAR的定义如下:
#if !defined(_NATIVE_WCHAR_T_DEFINED)
typedef unsigned short WCHAR;
#else
typedef wchar_t WCHAR;
#endif
https://learn.microsoft.com/en-us/windows/win32/extensible-storage-engine/wchar
那么你可以得出结论,在Windows上它被定义为无符号的吗?
我在多个平台上进行了测试,没有进行任何优化。
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)与2)相同的代码,在RedHat(版本未知)+gcc 4.4.7上:它再次打印0x000000000EFF0000
。wchar_t
是带符号的。
我没有测试printf
的实现,也没有测试WinAPI的WCHAR
定义,但测试了编译器内置的wchar_t
类型(在任何头文件中都没有关于其带符号性的规定)以及C-to-ASM编译器引擎的行为。
请注意,1)和3)上的编译器由同一供应商GNU Project提供。答案肯定取决于平台。(有人可以在Visual C ++上测试吗?)
wchar_t
类型时使用unsigned short
。猜测在更改为wchar_t
时,unsigned
只是被错误地留在了那里。 - Bo Perssonwchar_t
。笼统的绝对规定往往没有什么帮助。 - Cameron