【问题标题】:weird gcc behavior with unsigned ints无符号整数的奇怪 gcc 行为
【发布时间】:2015-02-24 09:27:25
【问题描述】:
#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的问题吗?
  • 打印也有问题,为什么投到uint8_t
  • @KarolyHorvath 对……我打印的方式也是错误的。但不知何故,它打印出正确的价值.. 不知道为什么
  • 因为它通常与 C 和 C++ 一样,这是运气和/或实现定义(或什至未定义)行为的结果。哥伦布侦探正在为你准备答案。在这种情况下,符号位为 0。

标签: c++ c++11 g++ c++14


【解决方案1】:

uint8_t 被允许(但不是必须)成为char(如果它恰好是无符号的)或unsigned char 的类型定义。并且这些输入是作为字符而不是数字来完成的。所以这是有效但不是必需的行为。

【讨论】:

  • 我知道这就是你的意思,但要明确一点:一些实现使 char 签名,而另一些则使其未签名。在签名的实现中,uint8_t 不允许作为 char 的 typedef。在未签名的实现中,它是允许的。
  • uint16_t 当然也可能是 unsigned char - 尽管在实践中你不太可能遇到这种情况。
  • @hvd 谢谢。澄清。
  • @AlanStokes 在uint16_tunsigned char 的系统上,uint8_t 将不存在并且 OP 的代码将无法编译:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多