wchar_t是未签名或签名的

问题描述 投票:6回答:3

在这个link unsigned wchar_ttypedefed为WCHAR。但我无法在我的SDK winnt.h或mingw winnt.h中找到这种typedef。

wchar_t是签名还是未签名?

我在C语言中使用WINAPI。

c winapi unicode wchar-t
3个回答
11
投票

wchar_t的签署没有具体说明。标准只说(3.9.1 / 5):

类型wchar_t应具有与其他整数类型相同的大小,符号和对齐要求(3.11),称为其基础类型。

(相比之下,类型char16_tchar32_t明确无符号。)


1
投票

请注意,平台的类型长度会有所不同。

Windows使用UTF-16,wchar_t是2个字节。 Linux使用4字节的wchar_t。


-1
投票

我刚刚在几个平台上进行了测试,没有进行优化。

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 ----

它打印0x00010EFFwchar_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 ----

它打印0x000000000EFF0000wchar_t签了名。对应的汇编代码说,movq $-131072, -16(%rbp)。 32位0xFFFE0000被提升为64位签名的-131072

3)与2)相同的代码,在RedHat(版本未知)+ gcc 4.4.7:它再次打印0x000000000EFF0000wchar_t签了名。

我既没有测试printf的实现,也没有测试WinAPI的WCHAR定义,但是编译器内置wchar_t类型的行为(没有关于它在任何头文件上的签名的规范)和C-to-ASM编译器引擎。

请注意,1)和3)上的编译器由同一供应商提供,即GNU项目。答案肯定取决于平台。 (有人会在Visual C ++上测试吗?)

© www.soinside.com 2019 - 2024. All rights reserved.