2

バックグラウンド:

私はテンプレート ストリーム演算子 (例: ) を持っています (これは、8 ビット整数型 (例: など)でoperator << (ostream &, std::vector <T>)ある可能性があるコンテナー要素を出力します)。unsigned charint_least8_t

問題:

デフォルトでは、これらのタイプはchar(ASCII) として出力されます。私はASCII変数にのみcharwchar_tまたは何でも)使用し、符号なし/符号付きタイプは決して使用しませんでした。呼び出し元が型を知らない場合でも、これらの他の 8 ビット型を常にsigned int/ (数値) として出力するにはどうすればよいですか?unsigned int

最初の試行:

たとえばoperator << (ostream &, unsigned char)、キャストを使用して定義しようとしました(GCCを使用)(つまり、値に対してはstream << static_cast <int> (value)機能しますが、出力は.unsigned charuint8_tchar

同じ基になる型 (つまりunsigned/signed char、オーバーロードでは使用できないため、たとえばoperator << (ostream &, int_fast8_t).

4

5 に答える 5

3

変数に保持されている実際のデータと、それを印刷するために選択した表現を混同しています。

次のように考えてください: charsintsdoubleslongs、何でも、それらはすべて、数値を格納するための単なるメモリの塊です。char は、0 から 255 (または -128 から 127) の間の数値です。表現することを選択できます。 ASCII 文字、数値、または OpenGL を使用した空の星として。

文字「a」の後ろの数字を表示したい場合は、そのメモリのチャンク (「a」を含む) を数字として扱うようにプログラムに指示するだけです。キャストを使用します。ここ:

http://www.cplusplus.com/doc/tutorial/typecasting/

それが役立つかどうかを確認してください!

于 2010-10-29T08:00:38.593 に答える
2

頭に浮かぶ 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;
}
于 2010-10-29T07:53:04.957 に答える
1

私があなたを正しく理解していれば..次のように出力します:

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 コード、2 番目のものは b に格納されている値だけです。とはまったく同じです。'a'9797ab

于 2010-10-29T07:52:44.343 に答える
1

単純にキャストできます:

#include<iostream>

int main()
{
 uint8_t blah = 65;
 std::cout << static_cast<int>(blah) << "\n";
 return 0;
}

65

于 2010-10-29T07:54:12.093 に答える
0

出力する前にキャストできます。

std::cout << (unsigned int) container[index];
于 2010-10-29T07:58:46.010 に答える