2017-12-25 31 views
0

これは私のプログラムの抜粋です。私はint8_tデータ型を使用していますが、入出力に関するいくつかの問題があります。どうやら、プログラムでint8_tを使用すると、g++コンパイラには-std=c++11フラグが設定されている必要があります。私はそれをしましたが、ランタイムエラーがあります。ここに私のコードは次のとおりです。C++ 11 int8_tバグ入力/出力

$ ./a.out 
Enter a number [1-100]: 95 
You entered: 9 
9/10 = 5 

$シェルプロンプトである:ここで

#include <iostream> 
#include <cstdint> 
using std::cout; 
using std::cin; 
using std::endl; 
int main() { 
    int8_t number; 

    cout << "Enter a number [1-100]: "; 
    cin >> number; 
    cout << "You entered: " << number << endl; 
    cout << number << "/10 = " << (number/10) << endl; 

    return 0; 
} 

は、プログラムの出力があります。とにかく、最初の数字だけが入力ストリームから読み込まれているようです。たとえそうであっても、整数除算9/105ではなく0を返します。このプログラムは95/10を行い、結果は9です。理論的には、このプログラムはうまくいくはずですが、除算演算子でさえもバグです。 int8_tの代わりにintを使用すると、プログラムが意図したとおりに動作することに注意してください。この場合、誰かがちょうど私にintデータ型を使用してそれを処理するように教えてくれると思われます。しかし、私たちはソフトウェアエンジニアです!私はint8_tデータ型に本質的に欠陥があるかどうかを知りたいと思います。なぜそれは適切なユーザーの入力を受け入れることができないだけでなく、除算演算子を壊す!使用する価値のあるプログラミング言語は、そのような不完全性から解放されていなければなりません。そして、私はC++が十分に普及していると思って、最終的に誰かがint8_tに何らかの欠陥があることに気づいたと思います。それが私の複雑さを知る必要があるものです。

答えて

2

最初に、C++の最小タイプはcharで、ほとんどのシステムでは、最後の数十年が8ビットのバイトです。したがって、タイプint8_tは通常signed charのエイリアスです。

>>オペレータとのストリームからcharsignedまたはunsigned)を読んで、それは文字を読み込む第二に、。エイリアスタイプ(int8_tなど)が使用されても問題はありませんが、これはまだcharタイプであり、文字として読み取られます。

その結果、1文字を読み込み、その文字のエンコードされた値が変数numberに格納されます。 ASCII encoding(これらの日に最も一般的な文字エンコーディング)の場合、変数numberは、10で除算された整数値57(文字の場合はASCII)を整数5と等しく格納します。

小さい整数を読み取る場合は、タイプとしてintを使用します。バイトに格納する場合は(int8_tを使用)、一時的なint変数を使用するか、変数をintにキャストする必要があります。このキャストは印刷のためにも行わなければなりません。そうしないと<<演算子のcharオーバーロードが使用されるため、デフォルトでは整数intのタイプを使用することをお勧めします。 intよりも小さいタイプを使用して

あなたが読めば/生のバイナリデータを書き込むのみ関連し、またはあなたはすべての単一のバイト(または多分ビット)カウント非常に小さな組み込みシステムにしています。

0

だから、一部のプログラマーの男のポストに、私は自分の印象を追加したいと思います。int8_tcharへのエイリアスであることから、coutcinが自動的charとして変数を扱い、文字入力/出力を行うようです。私はこれを回避する方法を考え出し、実際には整数変数のユーザー入力/出力を行います。それは簡単です。私は、Cプログラミング言語の関数printf()scanf()を使って仕事をしています。これらの関数には、変数を任意のデータ型として扱うための書式指定子があります。 coutcinは自動的にデータ型を解釈しますが、printf()scanf()のために手動で行うことができます。これにより、ある程度の力が得られます。今、私のコードは次のようになります。

#include <iostream> 
#include <cstdint> 
#include <cstdio> // you need this for printf() and scanf() 
using std::cout; 
using std::cin; 
using std::endl; 
int main() { 
    int8_t number; 

    cout << "Enter a number [1-100]: "; 
    // %hhd allows you to treat int8_t as an integer data type, instead of 
    // a character 
    scanf("%hhd", &number); 
    printf("You entered: %hhd\n", number); 
    printf("%hhd/10 = %hhd\n", number, (number/10)); 

    return 0; 
} 

と実際の出力は次のようになります。

$ ./a.out 
Enter a number [1-100]: 95 
You entered: 95 
95/10 = 9 

それはハックですが、それは動作します!まあ、あなたは何か新しいことを毎日学びます。


この回答を編集して、より多くの研究をしたいと思っている人に関連する関連するリンクを追加したいと思います。

Are int8_t and uint8_t intended to be char types?

Difference between int32, int, int32_t, int8 and int8_t