C++ 带有未签名整数的奇怪gcc行为 #包括 #包括 #包括 使用名称空间std; int main() { uint16_t ii; std::cin>>ii; printf(“%d\n”,ii); }

C++ 带有未签名整数的奇怪gcc行为 #包括 #包括 #包括 使用名称空间std; int main() { uint16_t ii; std::cin>>ii; printf(“%d\n”,ii); },c++,c++11,g++,c++14,C++,C++11,G++,C++14,当我输入5时,输出也是5。但是当我将ii的类型更改为uint8\t时,我得到的不是5,而是53,它似乎是5的ASCII值。这是预期的吗?uint8\t允许(但不是必需的)作为char(如果恰好是未签名的)或未签名的char的类型定义。这些输入是作为字符而不是数字来完成的。因此,这是有效的,但不是必需的行为。但是,我使用了printf not cout right。cin不是有问题吗?打印也是有问题的,为什么要转换到uint8\t?@KarolyHorvath正确..我打印的方式也是错误的。但不知

当我输入
5
时,输出也是
5
。但是当我将
ii
的类型更改为
uint8\t
时,我得到的不是
5
,而是
53
,它似乎是
5
的ASCII值。这是预期的吗?

uint8\t
允许(但不是必需的)作为
char
(如果恰好是未签名的)或
未签名的char
的类型定义。这些输入是作为字符而不是数字来完成的。因此,这是有效的,但不是必需的行为。

但是,我使用了printf not cout right。cin不是有问题吗?打印也是有问题的,为什么要转换到
uint8\t
?@KarolyHorvath正确..我打印的方式也是错误的。但不知怎的,它打印出了正确的值。。不确定为什么它通常是用C+C++,这是运气和/或实现定义(或甚至没有定义)行为的结果。哥伦布侦探正在为你准备答案。在本例中,符号位为0。我知道这是您的意思,但要明确的是:一些实现使
char
有符号,其他实现使其无符号。在签名的实现中,
uint8\u t
不允许是
char
的typedef。在未签名的实现中,它是允许的。
uint16\u t
当然也可能是
unsigned char
——尽管在实践中您不太可能遇到这种情况。@hvd谢谢。澄清。@AlanStokes在
uint16\u t
unsigned char
的系统上,
uint8\u t
将不存在,OP的代码也不会编译:)
#include <iostream>

#include <cstdint>
#include <cstdio>

using namespace std;

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