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

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

    関連記事

    C++のfork関数の構文や使い方について

      <目次> (1) C++のfork関数の構文や使い方について  (1-1) fork()関数とは?概要や目的  (1-2) fork()関数の構文  (1-3) fork()関数のサンプ …

    ValgrindのPossibly Lostの意味や実際のサンプルをご紹介

      <目次> (1) ValgrindのPossibly Lostの意味や実際のサンプルをご紹介  (1-1) Valgrindの「Possibly Lost」はどんな状況?  (1-2) …

    C++の値渡しと参照渡しの使い分けや違いについて

    <目次> (1) C++の値渡しと参照渡しの使い分けや違いについて  (1-1) 「値渡し」とは?  (1-2) 「参照渡し」とは?  (1-3) 「値渡し」と「参照渡し」の使い分け (1) C++の …

    C++の動的メモリ割当と静的メモリ割当の違いについて

      <目次> (1) C++の動的メモリ割当と静的メモリ割当の違いについて  (1-1) 静的メモリ割当てとは?  (1-2) 動的メモリとは?  (1-3) 動的メモリの割当て  (1-4 …

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

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

    • English (United States)
    • 日本語
    Top