繁体   English   中英

g ++和clang ++与流输入和无符号整数的不同行为

[英]g++ and clang++ different behaviour with stream input and unsigned integer

我发现gcc(4.9.2)和clang(3.5.0)之间的行为有所不同,令我感到惊讶。

当我尝试从使用std::istringstream初始化的std::istringstream提供unsigned int (在示例中为“-15”),我得到

  • 使用clang ++的错误(带有fail()位)
  • 使用带有gcc ++的signed(-15)进行初始化

我准备了以下示例程序。

#include <sstream>
#include <iostream>

int main ()
 {
   std::istringstream iss("-15");

   unsigned int  ui;

   iss >> ui;

   std::cout << "ui[" << ui << "] signed(ui)[" << signed(ui)
      << "] flags[" << iss.fail() << iss.good() << iss.bad()
      << iss.eof() << "]\n";

   return 0;
 }

使用clang ++,我获得以下输出

ui[0] signed(ui)[0] flags[1001]

使用g ++,我获得以下输出

ui[4294967281] signed(ui)[-15] flags[0001]

我有两个问题。

首先是显而易见的:谁是对的? clang ++,g ++还是一个未定义的行为?

第二个是:我如何强制gcc ++的行为类似于clang ++,从一个以减号开头的字符串中提取无符号值时会出错?

谢谢,抱歉我的英语不好。

编辑2016.04.03

我意识到这不是g ++和clang ++之间的区别,而是libstd ++和libc ++之间的区别。

使用clang ++和libstd ++编译和链接,我获得了与g ++相同的输出。

抱歉。

这在前面已经讨论过: 负数字串(例如“-10”)到无符号短路

答案是根据C ++标准22.4.2.1.2p3,转换需要失败,值存储应该是:

对于无符号整数类型 ,最负的可表示值或零 ,如果该字段表示的值太大而无法在val中表示。 ios_base :: failbit被分配给err。

因此,clang ++是正确的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM