一小段代码让我发疯,但希望你能阻止我跳出窗外。看这里:
#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 位。
对于大多数(也许是所有)编译器来说,这意味着它将成为以下类型的 typedefsigned char
.(由于该术语的定义中有一个怪癖有符号整数类型,它不能是普通的 typedefchar
, 即使char
碰巧已签名)。
The >>
运算符特殊对待字符类型。读取字符读取单个输入字符,而不是表示某个十进制整数值的字符序列。所以如果下一个输入字符是'0'
,读取的值将是特点 value '0'
,大概是 48。
Since a typedef
为现有类型创建别名,而不是新的不同类型,因此无法>>
操作员知道您想要治疗int8_t
作为整数类型而不是字符类型。
问题在于,在大多数实现中,不存在不是字符类型的 8 位整数类型。
唯一的解决方法是读入int
变量,然后转换为int8_t
(如果需要的话可以进行范围检查)。
顺便,int8_t
is a signed类型;对应的无符号类型是uint8_t
,其范围为 0..255。
(还有一个考虑因素:如果CHAR_BIT > 8
,这是标准允许的,那么两者都不是int8_t
nor uint8_t
将会被定义。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)