[C言語]複数文字リテラルの謎

C言語には、複数文字からなる文字定数(リテラル)は全て 4バイトのint型になるという決まりがあるのですが、Linux環境でワイド文字を扱うとバグるという現象がありまして、調べてみました。

#include <stdio.h>
void main(){
printf("1:[%016llx]\n", (long long) "12345678");
printf("2:[%016llx]\n", (long long)u"12345678" );
printf("3:[%016llx]\n", (long long)L"12345678" );
printf("4:[%016llx]\n", '12345678');
printf("5:[%016llx]\n", u'12345678');
printf("6:[%016llx]\n", L'12345678');
}
ソースコード
1:[3837363534333231]
2:[0034003300320031]
3:[0000003200000031]
4:[0000000035363738]
5:[0000000000000038]
6:[0000000000000038]
出力
1. ANSI文字列は1文字目から順番に下位バイトに格納される
2. utf16文字列は1バイト飛ばしで最初の4文字が格納される
3. 何故か、wchar_t 文字列が 32バイトとして扱われる、3バイト飛ばしで最初の2文字しか格納されない環境が存在する。
4. 複数文字リテラル(文字定数)は最後の4バイトが int 型で格納される。
6. wchar_t 宣言した複数文字リテラルは32bitなので最後の1バイトだけ格納される。
5 utf16 宣言した複数文字リテラルもなぜか最後の1バイトだけ格納される。なぜか、"0000000000370038" にならない。

この現象、ほんとよくわからない ・ω・

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です