動作環境
RAD Studio 10.2 Tokyo Update 3
実装
Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char code;
String msg;
code = 0xFF;
msg = String().sprintf(L"[%02X]", code);
Memo1->Lines->Add(msg);
code = 0x0A;
msg = String().sprintf(L"[%02X]", code);
Memo1->Lines->Add(msg);
}
//---------------------------------------------------------------------------
実行
一つ目が[FF]
ではなく[FFFFFF]
になっている。
失敗の理由
下記のように定義している。
char code;
char型の定義はC++ コンパイラ | 拡張の[unsigned char 型]
定義に基づく。
コンパイラは、char 宣言を unsigned char 型であるかのように処理します。これにより、他のコンパイラとの互換性が提供されます。
デフォルト値は[false]です(char 型は符号付きになります)。
char code
はIDEのデフォルトではsigned型であり、そこに0xFFを代入してマイナス値になっていた。
マイナス値を与えた場合の挙動として上記のように[FFFFFF]
が返された。
まとめ
char code
ではなくsigned char code
やstdint.hの符号なし指定を使うこと。