簡體   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