3 回答

TA貢獻1806條經(jīng)驗 獲得超5個贊
這在§5/ 9中明確概述:
許多期望算術(shù)或枚舉類型的操作數(shù)的二元運算符會以類似的方式引起轉(zhuǎn)換并產(chǎn)生結(jié)果類型。目的是產(chǎn)生一個通用類型,它也是結(jié)果的類型。這種模式稱為通常的算術(shù)轉(zhuǎn)換,定義如下:
如果任一操作數(shù)是類型
long double
,則另一個操作數(shù)應轉(zhuǎn)換為long double
。否則,如果任一操作數(shù)是
double
,則另一個操作數(shù)應轉(zhuǎn)換為double
。否則,如果任一操作數(shù)是
float
,則另一個操作數(shù)應轉(zhuǎn)換為float
。否則,應對兩個操作數(shù)執(zhí)行整體促銷。
然后,如果任一操作數(shù)是
unsigned long
另一個應轉(zhuǎn)換為unsigned long
。否則,如果一個操作數(shù)是a
long int
和另一個unsigned int
,那么如果along int
可以表示a的所有值unsigned int
,unsigned int
則應轉(zhuǎn)換為along int
; 否則兩個操作數(shù)都應轉(zhuǎn)換為unsigned long int
。否則,如果任一操作數(shù)是
long
,則另一個操作數(shù)應轉(zhuǎn)換為long
。否則,如果任一操作數(shù)是
unsigned
,則另一個操作數(shù)應轉(zhuǎn)換為unsigned
。[ 注意:否則,唯一剩下的情況是兩個操作數(shù)都是
int
]
在兩個場景中,結(jié)果operator+
都是unsigned
。因此,第二種情況是有效的:
int result = static_cast<int>(us + static_cast<unsigned>(neg));
因為在這種情況下,值us + neg
不能表示int
,值result
是實現(xiàn)定義的 - §4.7/ 3:
如果目標類型已簽名,則如果可以在目標類型(和位字段寬度)中表示該值,則該值不會更改; 否則,該值是實現(xiàn)定義的。

TA貢獻2051條經(jīng)驗 獲得超10個贊
在C標準化之前,編譯器之間存在差異 - 一些遵循“保值”規(guī)則,另一些遵循“簽署保留”規(guī)則。保留符號意味著如果任一操作數(shù)是無符號的,則結(jié)果是無符號的。這很簡單,但有時會給出相當驚人的結(jié)果(特別是當負數(shù)轉(zhuǎn)換為無符號時)。
C對更復雜的“保值”規(guī)則進行了標準化。在保值規(guī)則下,促銷可以/確實取決于類型的實際范圍,因此您可以在不同的編譯器上獲得不同的結(jié)果。例如,在大多數(shù)MS-DOS編譯器上,它們int
的大小short
和long
它們的大小相同。在許多當前系統(tǒng)int
上,它們的大小與之相同long
,并且short
兩者都不同。使用保值規(guī)則,這些可以導致促銷類型在兩者之間不同。
值保留規(guī)則的基本思想是,如果可以表示較小類型的所有值,它將提升為更大的簽名類型。例如,16位unsigned short
可以提升為32位signed int
,因為每個可能的值unsigned short
都可以表示為a signed int
。當且僅當需要保留較小類型的值時,類型將被提升為無符號類型(例如,如果unsigned short
和signed int
都是16位,則a signed int
不能代表所有可能的值unsigned short
,因此unsigned short
將被提升為unsigned int
)。
當您按原樣分配結(jié)果時,無論如何都會將結(jié)果轉(zhuǎn)換為目標類型,因此大多數(shù)情況都會產(chǎn)生相對較小的差異 - 至少在大多數(shù)情況下,它只會將位復制到結(jié)果中,并且由您來決定是將其解釋為已簽名還是未簽名。
當你沒有分配比較結(jié)果時,事情會變得非常難看。例如:
unsigned int a = 5;signed int b = -5;if (a > b) printf("Of course");else printf("What!");
在符號保留規(guī)則下,b
將被提升為無符號,并且在此過程中變得相等UINT_MAX - 4
,所以“什么!” if
將采取的腿。使用保值規(guī)則,您可以設法產(chǎn)生一些奇怪的結(jié)果,但是1)主要在類似DOS的系統(tǒng)中,int
其大小short
與2 相同,并且2)無論如何通常都難以做到。

TA貢獻1880條經(jīng)驗 獲得超4個贊
它會選擇你輸入結(jié)果的任何類型,或者至少cout在輸出過程中尊重那種類型。
我不記得肯定,但我認為C ++編譯器為兩者生成相同的算術(shù)代碼,它只是比較和輸出關心符號。
- 3 回答
- 0 關注
- 412 瀏覽
添加回答
舉報