[英]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 short
的typedef
,但它們在 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.