2017-12-25 11 views
0

Dies ist ein Code aus meinem Programm geschnitten. Ich verwende den Datentyp int8_t, und ich habe einige Probleme mit der Eingabe/Ausgabe. Offensichtlich erfordert die Verwendung von int8_t im Programm die -std=c++11-Flag für den g++ Compiler festgelegt werden. Ich habe das gemacht, aber es gibt Laufzeitfehler. Hier ist mein Code:C++ 11 int8_t fehlerhafte Eingabe/Ausgabe

#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; 
} 

Hier ist die Ausgabe des Programms:

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

Die $ ist die Shell-Prompt. Wie auch immer, es scheint, dass nur die erste Ziffer aus dem Eingabestrom gelesen wird. Trotzdem sollte die Ganzzahl-Division 9/100, nicht 5 zurückgeben. Dieses Programm soll 95/10 tun und ein Ergebnis von 9 zurückgeben. Theoretisch sollte dieses Programm funktionieren, aber anscheinend ist sogar der Divisions-Operator fehlerhaft. Ich sollte eine Notiz machen, dass die Verwendung von int anstelle von int8_t bewirkt, dass das Programm wie vorgesehen funktioniert. Ich vermute, dass in diesem Fall jemand mir sagen würde, dass ich den int Datentyp verwenden und damit umgehen soll. Aber wir sind Softwareentwickler! Ich würde gerne wissen, ob der int8_t Datentyp inhärent fehlerhaft ist. Warum kann es nicht richtige Benutzereingaben akzeptieren, sondern bricht auch die Division Operator ?! Jede Programmiersprache, die es wert ist, verwendet zu werden, muss frei von derartigen Unvollkommenheiten sein. Und ich denke, dass C++ so populär ist, dass irgendwann jemand erkannte, dass int8_t in gewisser Hinsicht fehlerhaft ist. Das ist etwas, das ich kennen muss, um die Feinheiten von.

Antwort

2

Zuerst ist der kleinste Typ in C++ char, und auf den meisten Systemen die letzten paar Dekaden, die gleich einem 8-Bit-Byte ist. Daher ist der Typ int8_t normalerweise ein Alias ​​für signed char.

Zweitens, wenn das Lesen ein char (signed oder unsigned) aus einem Strom mit dem >> Operator, es liest einen Charakter. Es spielt keine Rolle, wenn ein Alias-Typ (wie int8_t) verwendet wird, es ist immer noch ein char Typ und wird als ein Zeichen gelesen. Das Ergebnis ist, dass Sie ein einzelnes Zeichen lesen und der kodierte Wert dieses Zeichens in Ihrer Variablen number gespeichert wird. Mit ASCII encoding (der gängigsten Zeichencodierung dieser Tage) wird die Variable number den Ganzzahlwert 57 (ASCII für das Zeichen '9') speichern, der durch 10 gleich der Ganzzahl 5 ist. Wenn Sie eine kleine ganze Zahl lesen möchten, verwenden Sie int für den Typ Wenn Sie es in einem Byte speichern möchten (mit int8_t), müssen Sie entweder temporäre int Variablen verwenden oder die Variable auf int umwandeln. Dieses Casting muss auch für das Drucken durchgeführt werden (da sonst die char Überladung des << Operators verwendet wird), so empfehle ich die Verwendung von einfachen int Typen für alle Ganzzahlen als Standard.

Verwendung von kleineren Typen als int ist nur relevant, wenn Sie rohe Binärdaten lesen/schreiben, oder Sie sind auf einem sehr kleinen Embedded-System, in dem jedes einzelne Byte (oder vielleicht sogar Bit) zählt.

0

So über etwas Posters des Programmierers nachdenkend, möchte ich meine eigenen Eindrücke hinzufügen.Es scheint, dass seit int8_t ist ein Alias ​​zu char, cout und cin automatisch behandeln die Variable als char, und tun Zeichen Eingabe/Ausgabe. Ich habe einen Weg gefunden, um dies zu umgehen, und tatsächlich tun Integer Benutzereingabe/Ausgabe auf der Variablen. Es ist einfach. Ich benutze die C-Programmiersprachenfunktionen printf() und scanf(), um die Aufgabe zu erledigen. Diese Funktionen verfügen über Formatbezeichner, mit denen Sie die Variable als beliebigen Datentyp behandeln können. Während cout und cin den Datentyp automatisch interpretieren, können Sie es manuell für printf() und scanf() tun, und das gibt Ihnen eine gewisse Macht. Nun ist mein Code sieht wie folgt aus:

#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; 
} 

Und die tatsächliche Ausgabe sieht wie folgt aus:

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

Es ist ein Hack, aber es funktioniert! Nun, du lernst jeden Tag etwas Neues.


diese Antwort bearbeiten, würde Ich mag einige relevante Links zu verwandten Fragen für die von Ihnen hinzuzufügen, die etwas mehr Forschung tun wollen.

Are int8_t and uint8_t intended to be char types?

Difference between int32, int, int32_t, int8 and int8_t