簡體   English   中英

具有無符號和有符號整數的C ++算術類型轉換

[英]C++ Arithmetic Type Conversion with unsigned & signed integers

碼:

#include<iostream>
using std::cout; using std::endl;

int main()
{
    unsigned int i = 5;
    int x = -3;

    cout << "(i + x) = " << (i + x) << endl;

    cout << "Set x to -6" << endl;
    x = -6;

    cout << "(i + x) = " << (i + x) << endl;
}

輸出:

(i + x) = 2
Set x to -6
(i + x) = 4294967295

在此示例中,由(i + x)返回的結果的類型是無符號整數,但是,我認為在進行算術類型轉換時,該有符號整數(在這種情況下為變量“ x”)應該被“提升”。運算之前將其轉換為無符號整數。 事實並非如此,因為(i + x)的第一個結果將是(5 +(2 ^ 31-1-3))= 4294967297而不是2。在這里我缺少什么嗎? 在我看來,只有最終結果會轉換為無符號整數,而不是初始操作數。

您的錯誤是假設計算為(5 + (2^31 - 1 - 3)) -3unsigned解釋基於最大值2^32 - 1 UINT_MAXUINT_MAX ),而不是2^31 - 1 INT_MAXINT_MAX )。 因此,您要使用2^32 - 1 - 3 UINT_MAX - 3UINT_MAX - 3 ),加5,由於超出了UINT_MAX ,它至少會在您的補碼系統中使用32位int s返回到2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM