第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

當二元運算符兩邊的簽名不同時,促銷規(guī)則如何工作?

當二元運算符兩邊的簽名不同時,促銷規(guī)則如何工作?

C++
慕碼人8056858 2019-08-27 16:40:48
當二元運算符兩邊的簽名不同時,促銷規(guī)則如何工作?考慮以下程序:// http://ideone.com/4I0dT#include <limits>#include <iostream>int main(){     int max = std::numeric_limits<int>::max();     unsigned int one = 1;     unsigned int result = max + one;     std::cout << result;}和// http://ideone.com/UBuFZ#include <limits>#include <iostream>int main(){     unsigned int us = 42;     int neg = -43;     int result = us + neg;     std::cout << result;}+運算符如何“知道”返回哪個正確的類型?一般的規(guī)則是把所有的參數(shù)轉(zhuǎn)換為最廣泛的類型,但在這里沒有明確的“贏家”之間int和unsigned int。在第一種情況下,unsigned int必須選擇作為結(jié)果operator+,因為我得到了結(jié)果2147483648。在第二種情況下,它必須選擇int,因為我得到了結(jié)果-1。然而,在一般情況下,我沒有看到這是如何可判定的。這是我看到的未定義的行為還是其他什么?
查看完整描述

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,那么如果a long int可以表示a的所有值unsigned int,unsigned int則應轉(zhuǎn)換為a long 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)定義的。


查看完整回答
反對 回復 2019-08-27
?
侃侃無極

TA貢獻2051條經(jīng)驗 獲得超10個贊

在C標準化之前,編譯器之間存在差異 - 一些遵循“保值”規(guī)則,另一些遵循“簽署保留”規(guī)則。保留符號意味著如果任一操作數(shù)是無符號的,則結(jié)果是無符號的。這很簡單,但有時會給出相當驚人的結(jié)果(特別是當負數(shù)轉(zhuǎn)換為無符號時)。

C對更復雜的“保值”規(guī)則進行了標準化。在保值規(guī)則下,促銷可以/確實取決于類型的實際范圍,因此您可以在不同的編譯器上獲得不同的結(jié)果。例如,在大多數(shù)MS-DOS編譯器上,它們int的大小shortlong它們的大小相同。在許多當前系統(tǒng)int上,它們的大小與之相同long,并且short兩者都不同。使用保值規(guī)則,這些可以導致促銷類型在兩者之間不同。

值保留規(guī)則的基本思想是,如果可以表示較小類型的所有值,它將提升為更大的簽名類型。例如,16位unsigned short可以提升為32位signed int,因為每個可能的值unsigned short都可以表示為a signed int。當且僅當需要保留較小類型的值時,類型將被提升為無符號類型(例如,如果unsigned shortsigned 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)無論如何通常都難以做到。


查看完整回答
反對 回復 2019-08-27
?
慕村225694

TA貢獻1880條經(jīng)驗 獲得超4個贊

它會選擇你輸入結(jié)果的任何類型,或者至少cout在輸出過程中尊重那種類型。

我不記得肯定,但我認為C ++編譯器為兩者生成相同的算術(shù)代碼,它只是比較和輸出關心符號。


查看完整回答
反對 回復 2019-08-27
  • 3 回答
  • 0 關注
  • 412 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號