LoginSignup
1
2

More than 3 years have passed since last update.

C++ Builder 10.2 Tokyo > mistake > "[%02X]"書式指定にて0xFFが[FFFFFF]になる症状と失敗の理由 > char定義: signed char

Last updated at Posted at 2019-11-25
動作環境
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);
}
//---------------------------------------------------------------------------

実行

2019-11-25_18h19_11.png

一つ目が[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の符号なし指定を使うこと。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2