2012-04-01 7 views
10

"無限"の数の算術演算(加算、減算、乗算)を行うことができるHugeIntegerというクラスをプログラミングしました。数字の各ビットを独立した数字(例えば1234 = 1,2,3,4)として扱います。私はこれらの数字をベクトル(vector<short>)に保存します。さて、各桁は0から9の値しか取ることができないので、実際には2バイトの数字として格納する必要はありません。数字を1バイトの符号なし整数として格納する方法はありますか?ありがとう!1バイトの符号なし整数C++

更新:

vector<unsigned char> v; 
v.push_back(1); 
v.push_back(2); 

for (size_t i = 0; i < v.size(); i++) 
    cout << v[i]; 

これは、不要な出力を生成します。ベクトルを反復処理するために使用するデータ型はどれですか?

+5

なぜ 'char'を使用しないのですか? – jwodder

+1

ヘッダーは、環境がそのようなタイプをサポートしている場合、 "uint8_t"という名前のタイプを提供します。 "uint8_t"は "unsigned char"のtypedefになります。したがって、すべての場合にオーバーロードが期待通りに機能しない可能性があります。 – nosid

+3

'unsigned char'はC++の" 1バイトの符号なし整数 "です。なぜあなたの問題を解決したくないのですか? –

答えて

21

はい、unsigned charを使用してください。

<stdint.h>が利用可能な場合は、uint8_tも使用できます。

+0

'uint8_t'は1バイトかコンパイルエラーです。 'unsigned char'は1バイトより大きいかもしれません(ただし、' uint8_t'はコンパイルエラーです)。 –

+1

@Ben: 'unsigned char'は常に「バイト」ですが、C/C++の用語では、「バイト」は8ビットを超えることがあります(通常は今日の標準では珍しいと思われるアーキテクチャでのみです)。 –

7

標準コンパイラタイプcharを混乱させないようにしてください。以下は完全に合法です:

char number[5] = { 1, 4, 3, 6, 2}; // Representation of decimal 14,362 

それはあなたが文字と考えることを強制charタイプについて何か特別なことがあることはありません。むしろ、適切なエンコーディングの下で​​文字として解釈する1バイトの値を保持するために、ライブラリルーチン(printfなど)がそれらを使用する値を保持するのに適した、ちょうど1バイトの便利なサイズです。

+0

ええ、これは私には新しいものでした。私はすべての文字の周りに一重引用符が必要だが、私は。ヒントをありがとう! – raze

1

uint_least8_tは、1つの10進数を格納するための最もコンパクトなデータ型です。

システムでサイズが1バイトのデータ型がサポートされている場合は、これがそのデータ型になります。それ以外の場合は、利用可能な次の最小データ型になります。

ストリーム挿入演算子を使用するときに値をキャストして、文字処理の代わりに数値出力が得られるようにする必要があります。

1

のstd :: ostreamに(具体的には、オペレータの異なるオーバーロードが< <が表示されますと一緒に使用するときに、unsigned char型にcoutの< <を使用してから見ている出力はダウン< <オペレータの仕組みにありますchar/unsigned charのオーバーロードは、通常、数値表現ではなく文字表現を必要とすると仮定します)

符号なしcharの基本表現は、ベクトルにプッシュしたものと同じです。 charは依然として符号なしの1バイト整数です)

あなたが出力を変更したい場合、あなたはcharまたはunsigned char型のために設計されて< <演算子のオーバーロードを使用しないようする必要が - それを行うための最も簡単な方法は、キャスト

vector<unsigned char> v; 
v.push_back(1); 
v.push_back(2); 

for (size_t i = 0; i < v.size(); i++) 
    cout << static_cast<int>(v[i]); 
0

を実行することですcharまたはunsigned charを1バイトの整数型として使用することは、必ずしも直接的なものではありません。時には、文字型ではなく数値型である必要がある場合もあります。そのような例がここにあります:1 byte integer data type 他には、いくつかの異なる型の引数のために関数が多重定義されています。

関連する問題