c ++ in <<で整数としてunsigned/signed charまたはタイプを出力する方法
-
27-09-2019 - |
質問
バックグラウンド:
テンプレートストリームオペレーターがあります(例: operator << (ostream &, std::vector <T>)
)(8ビットの整数タイプである可能性のある出力コンテナ要素(例: unsigned char
, int_least8_t
, 、et cetera)。
問題:
デフォルトは、これらのタイプがASとして出力されることです char
(ASCII)。私はしか使用しませんでした char
(また wchar_t
または何でも)ASCII変数の場合、署名/署名されていないタイプはありません。これらの他の8ビットタイプを常に出力するにはどうすればよいですか signed int
/ unsigned int
(数字)代わりに、発信者がタイプを知らない場合でも?
最初に試みる:
たとえば定義するなど、(GCCで)試しました operator << (ostream &, unsigned char)
キャストが入っています(すなわち stream << static_cast <int> (value)
. 。それは機能します unsigned char
値がありますが、その後 uint8_t
aのように出力されます char
.
同じ基礎となるタイプ(すなわち unsigned/signed char
過負荷で使用できないので、たとえば過負荷を定義することはできません operator << (ostream &, int_fast8_t)
.
解決
頭に浮かぶ1つの方法は、タイプ特性を使用して各タイプの出力タイプを定義することです。すべてのタイプについて手作業でそれを宣言する必要があります。特性は、データタイプ自体とは異なる出力タイプを持つすべてのデータタイプに特化したテンプレート構造として定義できます。
template< T >
struct output_trait {
typedef const T & output_type;
}
あなたのオペレーターであなたは書いています:
std::cout << static_cast< output_trait< T >::output_type >( variable ) << std::endl;
これはデフォルトではキャストされませんが、その種類の場合は output_trait
専門化されていますそれはキャストを行います:
template<>
struct output_trait< unsigned char > {
typedef unsigned int output_type;
}
他のヒント
実際のデータを変数に混乱させ、印刷するために選択した表現が何であれ、あなたは混乱しています。
このように考えてください: chars
, ints
, doubles
, longs
, 、何でも、それらはすべてあなたが数字を保存するための記憶の塊です。チャーは0〜255(または-128と127)の数です - あなたはそれをASCII文字として、またはAとして表現することを選択できます数、またはOpenGLの助けを借りて空の星として。
キャラクター「A」の背後にある番号を表示したい場合は、プログラムにそのメモリの塊(「A」が含まれている)を数字として扱うように指示してください。キャストを使用します。ここ:
http://www.cplusplus.com/doc/tutorial/typecasting/
それが役立つかどうか見てください!
あなたは単にそれをキャストすることができます:
#include<iostream>
int main()
{
uint8_t blah = 65;
std::cout << static_cast<int>(blah) << "\n";
return 0;
}
65
私があなたを正しく理解しているなら..このように出力します:
std::cout << ( unsigned int )char << '\n';
またはそれ以上のC ++スタイル - たとえば、static_castを使用してください。
int main()
{
char a = 'a';
char b = 97;
std::cout << static_cast< unsigned int >( a ) << '\n';
std::cout << static_cast< unsigned int >( b ) << '\n';
return 0;
}
両方とも std::cout
同じものを印刷します:最初のもの - のASCIIコード 'a'
: 97
, 、2番目のもの - 値だけ 97
, 、bに保存されています。両方、 a
と b
, 、まったく同じです。
出力する前にキャストできます。
std::cout << (unsigned int) container[index];