为什么int8_t和用户通过cin输入显示奇怪的结果
Why does int8_t and user input via cin shows strange result
一小段代码让我抓狂,但希望你能阻止我跳出窗外。看这里:
#include <iostream>
#include <cstdint>
int main()
{
int8_t i = 65;
int8_t j;
std::cout << "i = " << i << std::endl; // the 'A' is ok, same as uchar
std::cout << "Now type in a value for j (use 65 again): " << std::endl;
std::cin >> j;
std::cout << "j = " << j << std::endl;
if (i != j)
std::cout << "What is going on here?????" << std::endl;
else
std::cout << "Everything ok." << std::endl;
return 0;
}
如果我用int
代替int8_t
,一切正常。我需要它是8位的unsigned integers
,不能更大。顺便说一句。对于unsigned char
,它的行为-当然-与int8_t
相同。
有人能给点提示吗?
int8_t
是一个整数类型的typedef,具有以下特征:纯2补码表示,无填充位,长度正好为8位。
对于大多数(也许是所有)编译器,这意味着它将是signed char
的typedef(由于术语有符号整数类型的定义中的一个奇怪之处,它不能是普通char
的typedef,即使char
恰好是有符号的)。
>>
运算符对字符类型进行特殊处理。读取字符读取单个输入字符,而不是以十进制表示某个整数值的字符序列。因此,如果下一个输入字符是'0'
,则读取的值将是字符值'0'
,可能是48。
由于typedef
为现有类型创建别名,而不是一个新的不同类型,因此>>
运算符无法知道您想将int8_t
视为整数类型而不是字符类型。
问题是,在大多数实现中,没有8位整数类型不是字符类型。
唯一的解决方法是读入int
变量,然后转换为int8_t
(如果需要,可以进行范围检查)。
int8_t
是一个有符号的类型;对应的unsigned类型为uint8_t
,取值范围为0 ~ 255。
(还有一点需要注意:如果CHAR_BIT > 8
是标准允许的,那么int8_t
和uint8_t
都不会被定义。)
int8_t
和uint8_t
几乎肯定是字符类型(int8_t和uint8_t打算表现得像字符吗?)所以std::cin >> j
将从stdin读取单个字符并将其解释为字符,而不是数字。
int8_t
可能与char
相同,这意味着cin >> j
将简单地从输入中读取单个字符('6'
)并将其存储在j
中。
int8_t
被定义为signed char
的typedef名称。因此,operator >>
用于类型为int8_t
的对象的行为与用于类型为signed char
的对象的行为相同
_t
类型不是第一类类型,它们是typedef
的别名,遵守一定的约束,例如int8_t
是一种可以存储有符号的8位值的类型。
在大多数系统上,这意味着它们是typedef
d到char
。因为它们是类型定义而不是一等类型,所以您调用的是cin.operator<<(char)
和cin.operator>>(char)
。
当你输入"65"时,cin.operator>>(char)
会使用'6',并将其ascii值54放入变量j
中。
要解决这个问题,你需要使用不同的类型,可能最简单的方法是使用更大的整数类型并应用约束,然后向下转换:
int8_t fetchInt8(const char* prompt) {
int in = 0;
for ( ; ; ) { // endless loop.
std::cout << prompt << ": ";
std::cin >> in;
if (in >= std::numeric_limits<int8_t>::min()
&& in <= std::numeric_limits<int8_t>::max()) {
std::cout << "You entered: " << in << 'n';
// exit the loop
break;
}
std::cerr << "Error: Invalid number for an int8n";
}
return static_cast<int8_t>(in);
}
注意,int8_t是有符号的,这意味着它存储-128到+127。如果你只想要正数,使用uint8_t类型。
- 显示基于用户输入的整数的字符
- 输入值后,如何在一个括号下显示值,例如"{6,7,8,9}
- 如何存储用户输入的所有数据,然后在他们想要查看所有数据时显示它们
- 我要求用户输入大小和数组,但是当我打印矢量时,它仅显示'0'作为输出
- 在命令行上将输入显示到数组中时如何删除 ./a.out?
- 将信息输入到下面显示的结构向量中的正确语法/格式是什么
- 下划线不会与"发送输入"一起显示C++
- C++ 我的开关格式中的循环不允许我显示菜单选项或接受输入?
- 通过功能进行2D矢量输入和显示
- 在数组中显示第一个元素用户输入
- 在大小为 10 的 char 数组中输入超过 10 个字符的字符串并输出时,它会显示整个数组而不是前 10 个数组.为什
- 程序输入名称和高度并显示它。我不知道如何显示列表中最高人的姓名和身高
- 如何向用户显示特定错误,要求他/她使用循环再次提供输入?
- isPalindrome不显示输出,isPalindrome函数未使用字符串输入作为字符串参数进行测试
- 从文本文件中读取并输入到数组结构中,然后显示读取的数据C++
- 如何让我的输出显示输入金额的星号
- 使用ifstreamwhile循环,如何显示输入错误并在下一行继续
- C++:帮助存储和显示输入文件变量
- 如何使用c++在Mac OSX中显示输入框
- 不显示输入的第二组信息