无符号整数在gcc中表现奇怪

7
#include <iostream>

#include <cstdint>
#include <cstdio>

using namespace std;

int main()
{
    uint16_t ii; 
    std::cin >> ii;                                                    
    printf("%d\n", ii);
}

当我输入 5 时,输出也是 5。但是当我把 ii 的类型改为 uint8_t 后,我得到的不是 5 而是 53,看起来是 5 的 ASCII 值。这是否是预期的结果?


但是,我使用的是printf而不是cout,对吧。问题不是在于cin吗? - gyro
打印也有问题,为什么要转换为 uint8_t - Karoly Horvath
@KarolyHorvath 对的..我的打印方式也是错误的。但不知何故它打印了正确的值.. 不确定为什么。 - gyro
通常情况下,就像C和C++一样,这是运气和/或实现定义(甚至未定义)行为的结果。侦探哥伦布只是在为您准备答案。在这种情况下,符号位为0。 - Karoly Horvath
1个回答

11

uint8_t允许(但不是必须)作为char(如果它是无符号的)或unsigned char 的typedef。对这些输入作为字符而不是数字进行。因此,这是有效的但不是必需的行为。


1
我知道你的意思,但是为了明确起见:一些实现使char有符号,另一些实现使其无符号。在char为有符号的实现中,uint8_t不能作为char的typedef。而在char为无符号的实现中,允许这样做。 - user743382
uint16_t 在实际应用中也可能是 unsigned char,不过这种情况出现的可能性较小。 - Alan Stokes
@hvd 谢谢。已澄清。 - Alan Stokes
@AlanStokes 在一个 uint16_t 被定义为 unsigned char 的系统中,uint8_t 将不存在,而且 OP 的代码将无法编译 :) - T.C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接