Gal*_*axy 0 printf iostream input cstdint c++11
这是我的程序中的一段代码。我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
这是程序的输出:
$ ./a.out
Enter a number [1-100]: 95
You entered: 9
9 / 10 = 5
Run Code Online (Sandbox Code Playgroud)
这$是 shell 提示符。无论如何,似乎只从输入流中读取第一个数字。即便如此,整数除法9 / 10应该返回0,而不是5。该程序旨在执行95 / 10并返回 的结果9。理论上,这个程序应该可以工作,但显然,即使是除法运算符也有问题。我应该注意的是,使用int而不是int8_t使程序按预期工作。我怀疑在这种情况下,有人会告诉我使用该int数据类型并处理它。但我们是软件工程师!我想知道int8_t数据类型是否存在固有缺陷。为什么它不能接受正确的用户输入,而且还破坏了除法运算符?!任何值得使用的编程语言都必须没有这些缺陷。我认为 C++ 足够流行,最终有人意识到它int8_t在某种意义上是有缺陷的。这是我需要了解其中复杂性的事情。
首先,C++ 中最小的类型是char,在过去几十年的大多数系统上,它等于 8 位字节。因此该类型int8_t通常是 的别名signed char。
其次,当使用运算符从流中读取char(signed或) 时,它会读取一个字符。是否使用别名类型(如 )并不重要,它仍然是一种类型,并且将被读取为字符。unsigned>>int8_tchar
因此,结果是您读取单个字符,并且该字符的编码值存储在您的变量中number。使用ASCII 编码(当今最常见的字符编码),变量将存储除以等于整数的number整数值57(字符 的 ASCII 值'9')。105
如果要读取小整数,请使用intfor 类型。如果你想将它存储在一个字节中(使用int8_t),你必须使用临时int变量,或者将变量转换为int. 打印时也必须进行此转换(因为否则将使用运算符char的重载),因此我建议默认情况下对任何整数使用普通类型。<<int
int仅当您读取/写入原始二进制数据,或者您位于一个非常小的嵌入式系统上,其中每个字节(甚至可能是位)都很重要时,才使用较小的类型。
| 归档时间: |
|
| 查看次数: |
1892 次 |
| 最近记录: |