0

这是我程序中的一段代码。我正在使用int8_t数据类型,并且在输入/输出方面遇到了一些问题。显然,int8_t在程序中使用需要为编译器-std=c++11设置标志。g++我这样做了,但是存在运行时错误。这是我的代码:

#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

$shell 提示符。无论如何,似乎只有第一个数字是从输入流中读取的。即便如此,整数除法9 / 10应该返回0,而不是5。该程序旨在执行95 / 10并返回9. 理论上,这个程序应该可以工作,但显然,即使是除法运算符也是有问题的。我应该注意,使用int而不是int8_t使程序按预期工作。我怀疑在这种情况下,有人会告诉我使用int数据类型并处理它。但我们是软件工程师!我想知道如果int8_t数据类型本身就有缺陷。为什么它不能接受正确的用户输入,而且还破坏了除法运算符?!任何值得使用的编程语言都必须没有这样的缺陷。而且我认为 C++ 足够流行,以至于最终有人意识到它int8_t在某种意义上是有缺陷的。这是我需要知道的复杂性。

4

2 回答 2

4

首先,C++ 中最小的类型是char,在过去几十年的大多数系统中,它等于 8 位字节。所以类型int8_t通常是signed char.

其次,当使用运算符从流中读取char(signed或) 时,它会读取字符。是否使用别名类型(如 )无关紧要,它仍然是一种类型并且将被读取为字符。unsigned>>int8_tchar

所以结果是您读取了一个字符,并且该字符的编码值存储在您的变量number中。使用ASCII 编码(当今最常见的字符编码),该变量number将存储除以整数的整数值57(字符的 ASCII 码) 。'9'105

如果要读取小整数,请使用int类型。如果要将其存储在一个字节中(使用int8_t),则必须使用临时int变量,或者将变量转换为int. 这种转换也必须用于打印(否则将使用运算符的char重载<<),因此我建议int默认情况下对任何整数使用普通类型。

使用比int仅在您读/写原始二进制数据时相关的更小的类型,或者您在一个非常小的嵌入式系统上,其中每个字节(甚至可能是)都很重要。

于 2017-12-25T22:41:35.477 回答
0

所以回顾一些程序员老兄的帖子,我想补充一下我自己的印象。似乎 sinceint8_t是 a 的别名charcoutcin自动将变量视为 a char,并进行字符输入/输出。我想出了一种方法来解决这个问题,并且实际上对变量进行整数用户输入/输出。这很简单。我使用 C 编程语言的函数printf()scanf()完成这项工作。这些函数具有格式说明符,允许您将变量视为任何数据类型。而自动解释数据类型coutcin您可以手动执行printf()and 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

这是一个黑客,但它的工作原理!好吧,你每天都会学到一些新东西。


编辑这个答案,我想为那些想要做更多研究的人添加一些相关问题的相关链接。

int8_t 和 uint8_t 是 char 类型吗?

int32、int、int32_t、int8和int8_t的区别

于 2017-12-25T23:04:13.837 回答