其他分享
首页 > 其他分享> > c – 为什么通过cin的int8_t和用户输入显示奇怪的结果

c – 为什么通过cin的int8_t和用户输入显示奇怪的结果

作者:互联网

参见英文答案 > uint8_t can’t be printed with cout                                    8个
一小段代码让我发疯,但希望你可以阻止我跳出窗外.看这里:

#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 char它的行为是相同的 – 当然 – 和int8_t一样.

有提示的人吗?

解决方法:

int8_t是具有所需特征的整数类型的typedef:纯二进制补码表示,无填充位,大小正好为8位.

对于大多数(也许是所有)编译器,这意味着它将成为signed char的typedef.(由于术语有符号整数类型的定义中的怪癖,它不能是普通char的typedef,即使char碰巧是签).

>>运算符特别处理字符类型.读取字符会读取单个输入字符,而不是表示十进制中某个整数值的字符序列.因此,如果下一个输入字符为’0′,则读取的值将是字符值’0′,可能是48.

由于typedef为现有类型创建了别名,而不是新的不同类型,因此无法使用>>运算符,要知道要将int8_t视为整数类型而不是字符类型.

问题是在大多数实现中没有8位整数类型,它不是字符类型.

唯一的解决方法是读入一个int变量,然后转换为int8_t(如果需要,可以使用范围检查).

顺便说一句,int8_t是签名类型;相应的无符号类型是uint8_t,其范围为0..255.

(还有一个考虑因素:如果CHAR_BIT> 8,这是标准所允许的,那么int8_t和uint8_t都不会被定义.)

标签:uint8t,c,int
来源: https://codeday.me/bug/20191003/1848740.html