我試圖理解陳述句的含義:
(int)(unsigned)-1 == -1;
據我目前的理解,會發生以下事情:
-1是有符號int的并被強制轉換為無符號int。這樣做的結果是,由于環繞行為,我們得到了該unsigned型別可以表示的最大值。接下來,
unsigned我們在步驟 1 中得到的這個型別最大值現在被轉換為signed int。但請注意,這個最大值是unsigned type. 所以這超出了signed type. 并且由于有符號整數溢位是未定義的行為,程式將導致未定義的行為。
我的問題是:
- 我上面的解釋正確嗎?如果不是,那么實際發生了什么。
- 這是我懷疑的未定義行為還是實作定義的行為。
PS:我知道如果它是未定義的行為(與定義的實作相反),那么我們不能依賴程式的輸出。所以我們不能說我們是否會永遠得到true或false。
uj5u.com熱心網友回復:
投到unsigned int環繞,這部分是合法的。
從 C 20 開始,超出范圍的強制轉換int是合法的,并且之前是實作定義的(但無論如何在實踐中都能正常作業)。這里沒有UB。
這兩個轉換相互抵消(同樣,在 C 20 中保證,之前實作定義,但無論如何在實踐中都有效)。
有符號溢位通常是 UB,是的,但這僅適用于由計算引起的溢位。由轉換引起的溢位是不同的。
參考
如果目標型別是有符號的,則如果源整數可以在目標型別中表示,則值不會更改。否則結果是:
(C 20 前) 實作定義
(C 20 起) 目標型別的唯一值等于源值的模數,其中是用于表示目標型別的位數。
2nn(請注意,這與未定義的有符號整數算術溢位不同)。
有關轉換如何作業的更多細節。
假設int并unsigned int占用 N 位。
兩者都可以表示int并且unsigned int轉換不會改變的值。所有其他值增加或減少 2 N以適應范圍。
這方便地不會更改值的二進制表示。
例如,int -1對應于(最大值),兩者都表示為二進制。類似地,(最小值)對應于(最大值 1)。unsigned int 2N-1unsigned int11...11int -2N-1intunsigned int 2N-1int
int: [-2^(n-1)] ... [-1] [0] [1] ... [2^(n-1)-1]
| | | | |
| '---|---|-----------|-----------------------.
| | | | |
'---------------|---|-----------|----------. |
| | | | |
V V V V V
unsigned int: [0] [1] ... [2^(n-1)-1] [2^(n-1)] ... [2^n-1]
uj5u.com熱心網友回復:
編輯:C 20 之前的版本不需要二進制補碼
它可能有助于理解 -1 的二進制表示,即:
0b1111'1111'1111'1111'1111'1111'1111'1111. 我應該注意,這是 -1 的 4 位元組表示。不同的機器可能代表int不同。
您正在轉換到unsigned然后回傳到int哪個更改您解釋 1 和 0 的方式。在十進制(或有時稱為 denary)中,您所做的相當于將其轉換4294967295為-1.
整數文字的型別是值可以適合的第一種型別,來自型別串列,這取決于使用了哪個數字基數和哪個整數后綴
因為-1適合int,這就是它的解釋方式。請參閱:https ://en.cppreference.com/w/cpp/language/integer_literal
這超出了有符號型別的范圍。而且由于有符號整數溢位
這不是整數溢位。這是二進制表示。整數溢位將是:
int int_max = 2147483647; // this is the maximum integer int on my machine
int one = 1;
int overflow = x s; // sum is equal to -2147483648
上面是一個整數溢位示例,因為最大表示
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/417709.html
標籤:
上一篇:關于使用C 的概率模型的問題
下一篇:如何正確增加這種“半鉆石”形狀?
