我遇到了 gcc (4.9.2) 和 clang (3.5.0) 之间的行为差异,这让我很惊讶。
当我尝试喂一个 unsigned int
来自 std::istringstream
用负值初始化(在示例中为“-15”)我得到
- clang++ 出现错误(
fail()
位已引发) - 使用
signed(-15)
进行初始化使用 gcc++
我准备了以下简单的示例程序。
#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++ 相同的输出。
对不起。
最佳答案
这里之前已经讨论过:Negative numeric string (e.g. "-10") to unsigned short
答案是根据C++标准22.4.2.1.2p3,要求转换失败,值存储应该是:
the most negative representable value or zero for an unsigned integer type, if the field represents a value too large negative to be represented in val. ios_base::failbit is assigned to err.
因此,clang++ 是正确的行为。
关于c++ - g++ 和 clang++ 对流输入和无符号整数的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36377836/