簡體   English   中英

在 C 中,如果我將“連續 wchar_t 字符”放入 wchar_t 變量會發生什么?

[英]In C, what would happen if I put 'successive wchar_t characters' into a wchar_t variable?

#include <stdio.h>

wchar_t wc = L' 459';
printf("%d", wc);           //result : 32

我知道 ASCII 代碼表中的“空格”是“十進制 32”。

我不明白的是,據我所知,如果變量沒有足夠的空間來存儲值,則該值將是原始值的“最后一位數字”。

就像,如果我將二進制值 '1100 1001 0011 0110' 放入單字節變量中,它將是 '0011 0110',它是原始二進制值的“最后一個字節”。

但是上面的代碼顯示了原始值的“第一個字節”。

我想知道當我執行上面的代碼時內存級別會發生什么。

_int64 x = 0x0041'0042'0043'0044ULL;
printf("%016llx\n", x);             //prints 0041004200430044

wchar_t wc;
wc = x;
printf("%04X\n", wc);               //prints 0044 as you expect

wc = L'\x0041\x0042\x0043\x0044';   //prints 0041, uses the first character
printf("%04X\n", wc);

如果您分配的整數值太大,編譯器將采用適合 2 個字節的最大值0x0044

如果您嘗試將多個元素分配給一個元素,編譯器將取第一個適合的元素0x0041 L'x'是一個單一的寬字符。


VS2019 將對wchar_t wc = L' 459'發出警告,除非警告級別設置為小於 3,但不建議這樣做。 使用警告級別 3 或更高。

wchar_t是原始類型,不是unsigned shorttypedef ,但它們在 Windows 中都是 2 個字節(在 linux 中為 4 個字節)

請注意, 'abcd'是 4 個字節。 L前綴表示每個元素 2 個字節(在 Windows 中),因此L'abcd'是 8 個字節。

要查看wc里面有什么,讓我們看看 Unicode 字符L'X' ,它的 UTF-16 編碼為0x0058 (類似於 ASCII 值高達 128)

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    wchar_t wc = L'X';
    wprintf(L"%c\n", wc);
    char buf[256];
    memcpy(buf, &wc, 2);
    for (int i = 0; i < 2; i++)
        printf("%02X ", buf[i] & 0xff);
    printf("\n");
    return 0;
}

輸出將為58 00 它不是00 58因為 Windows 在小端系統上運行並且字節被翻轉。

另一個奇怪的事情是 UTF16 使用 4 個字節來表示某些代碼點。 因此,您將收到此行的警告:

wchar_t wc = L'😀';

相反,您想使用字符串:

wchar_t *wstr = L"😀";
::MessageBoxW(0, wstr, 0, 0); //console may not display this correctly

該字符串將是 6 個字節(2 個元素 + 空終止字符)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM