2017-12-25 31 views
0

이것은 내 프로그램의 코드 조각입니다. int8_t 데이터 형식을 사용하고 있으며 입/출력에 문제가 있습니다. 프로그램에서 int8_t을 사용하면 g++ 컴파일러에 -std=c++11 플래그를 설정해야합니다. 그랬지만 런타임 오류가 있습니다. 여기 내 코드는 다음과 같습니다C++ 11 int8_t 버그 입력/출력

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

은 프로그램의 출력입니다 :

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

쉘 프롬프트입니다. 어쨌든 입력 스트림에서 첫 번째 숫자 만 읽는 것 같습니다. 그렇더라도 정수 구분 9/105이 아니라 0을 반환해야합니다. 이 프로그램은 95/10을 수행하고 9의 결과를 반환합니다. 이론적으로이 프로그램은 작동해야하지만 분열 연산자조차도 버그가 있습니다. int8_t 대신 int을 사용하면 프로그램이 의도 한대로 작동합니다. 이 경우 누군가가 int 데이터 유형을 사용하고 처리하겠다고 말한 것 같습니다. 그러나 우리는 소프트웨어 엔지니어입니다! int8_t 데이터 형식에 본질적으로 결함이 있는지 알고 싶습니다. 왜 적절한 사용자 입력을 받아 들일 수 없으며 또한 나눗셈 연산자를 어기 는가? 사용 가치가있는 프로그래밍 언어는 이러한 불완전 성이 없어야합니다. 그리고 저는 C++이 충분히 대중적이어서 결국 어떤 사람은 int8_t이 어떤 의미에서 결함이 있다는 것을 깨달았습니다. 그것은 내가 복잡한 것을 알 필요가있는 것이다.

답변

2

먼저 C++에서 가장 작은 유형은 char이고, 대부분의 시스템에서 8 비트 바이트와 동일한 수십 년간입니다. 따라서 int8_t 유형은 일반적으로 signed char의 별명입니다. >> 연산자 스트림으로부터 char (signed 또는 unsigned)를 읽을 때

둘째, 그것은 문자를 판독한다. 별칭 유형 (예 : int8_t)이 사용되는 경우에는 문제가되지 않지만 여전히 char 유형이며 문자로 읽습니다.

결과적으로 단일 문자를 읽고 해당 문자의 인코딩 된 값은 변수 number에 저장됩니다. ASCII encoding (요즘 가장 일반적인 문자 인코딩) 변수 number57 (문자는 '9' 인 ASCII)을 나누어 10으로 나눈 값이 정수인 5과 같습니다.

작은 정수를 읽으려면 유형에 int을 사용하십시오. 바이트를 int8_t을 사용하여 바이트 단위로 저장하려면 int 임시 변수를 사용하거나 int 변수로 캐스트해야합니다. 이 캐스팅은 인쇄용으로도 수행되어야합니다. 그렇지 않으면 << 연산자의 char 오버로드가 사용될 것이기 때문에 모든 정수에 대해 일반 int 유형을 사용하는 것이 좋습니다. 당신은 원시 이진 데이터를 읽기/쓰기 경우 int보다 작은 유형을 사용

에만 관련이 있습니다, 또는 당신은 아주 작은 임베디드 시스템에있어 어디에 모든 단일 바이트 (또는 어쩌면 비트) 계산됩니다.

0

그래서 일부 프로그래머의 게시물에 반영, 나는 내 자신의 인상을 추가하고 싶습니다.int8_t 별칭이 char, 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