[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" にならない。
この現象、ほんとよくわからない ・ω・
Comments