Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

C++

C++のunsigned char型とは?概要やsigned charとの違いもご紹介

投稿日:2022年1月18日 更新日:

<目次>

(1) C++のunsigned char型とは?概要やsigned charとの違いもご紹介
 (1-1) 概要
 (1-2) サンプルプログラム①:疎通確認

(1) C++のunsigned char型とは?概要やsigned charとの違いもご紹介

(1-1) 概要

「unsigned char」と「signed char」はいずれも、単一の文字を格納するために使用されます(※ただし、配列で定義すれば複数文字を格納可能)。いずれもbyte型と同様に、1バイト分のメモリを確保する点は少し似ていますが、byteはバイナリデータそのもの(生のバイナリデータ)を保持するのに対して、char系は文字を保持する目的の点で用途が異なります。

・①符号付きchar
1バイトの内、先頭1ビット=符号ビット、残り7ビット=データ部で構成されます。0~255の範囲で表現が可能で、ASCII文字(0~127)+拡張ASCII(128~255)を1文字表現できます。

・②符号無しchar
1バイト=8ビット全てがデータ部で構成されます。-128~+127の範囲で表現が可能で、ASCII文字(0~127)を1文字表現できます。

(図111)
 
そのため、例えば文字「A」が格納されている場合は、実際は「A」に対応する値「65」を保持しています。

●初期化の方法

・①signed charの場合、変数定義時に明示的にキーワードを宣言する必要は無い
//# 65 = Aを表す
char c1 = 65;
 
・②unsinged charの場合、変数定義時に明示的にキーワードを宣言する必要がある
//# 65 = Aを表す
unsigned char c2 = 65;
 

●使い分け

もしint型の値がマイナスの値になる事を想定していない場合、unsignedにしておく事で、「0未満になる想定がない」意図を明確にする事が出来、プログラムの可読性の向上が見込めます。
また、ASCII文字(0~127)を使う場合は通常のchar(signed)で十分ですが、もし拡張ASCII(128~255)を使いたい場合や、バイナリデータ(バイト情報)を扱う場合などはunsignedにします。
 

(1-2) サンプルプログラム①:疎通確認

試しに「signed char」(char)と「unsigned char」にそれぞれ「65」を代入すると、文字列「A」になる事の確認です。

#include <iostream>
#include <bitset>
using namespace std;

int main(void){
    char sc = 65;
    bitset<8> sc_bin(sc);
    cout << sc << " - " << sc_bin << endl;
    
    unsigned char uc = 65;
    bitset<8> uc_bin(uc);
    cout << uc << " - " << uc_bin << endl;
}
このプログラムでは「<bitset>」標準ヘッダをインクルードして、bitset<8>で引数に与えたcharを手軽にビット列に変換する事が出来ます。
 
(図121)

    Adsense審査用広告コード


    Adsense審査用広告コード


    -C++

    執筆者:


    comment

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

    関連記事

    Valgrindの使い方や見方について(基礎編)

      <目次> (1) Valgrindの使い方や見方について(基礎編)  (1-1) メモリリークのチェックのやり方  (1-2) 「valgrind」コマンドの基本的な使い方  (1-3) …

    C++の「int **g = new int*;」の意味について

      <目次> (1) C++の「int **g = new int*;」の意味について  (1-1) 「int **g = new int*;」の意味  (1-2) サンプルで理解を深める …

    C++で発生した「 _CrtIsValidHeapPointer(block)」と「is_block_type_valid(header->_block_use)」エラーについて

      <目次> (1) C++で発生した「 _CrtIsValidHeapPointer(block)」と「is_block_type_valid(header->_block_use) …

    Base64とは?概要やアルゴリズムについてご紹介

      <目次> (1) Base64とは?概要やアルゴリズムについてご紹介  (1-1) Base64とは?  (1-2) Base64の仕組み  (1-3) Base64の実装 (1) Ba …

    C++のlocaltime関数がスレッドアンセーフである理由と使用上の注意点

      <目次> (1) C++のlocaltime関数がスレッドアンセーフである理由と使用上の注意点  (1-1) localtime関数がスレッドアンセーフである理由  (1-2) loca …

    • English (United States)
    • 日本語
    Top