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

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

無符號整數(shù)減法是否定義了行為?

無符號整數(shù)減法是否定義了行為?

C
慕尼黑8549860 2019-08-16 16:47:01
無符號整數(shù)減法是否定義了行為?我遇到的代碼來自一個似乎認為在結(jié)果為負時從另一個相同類型的整數(shù)中減去無符號整數(shù)的問題。因此,即使它恰好適用于大多數(shù)體系結(jié)構(gòu),這樣的代碼也是不正確的。unsigned int To, Tf;To = getcounter();while (1) {     Tf = getcounter();     if ((Tf-To) >= TIME_LIMIT) {         break;     } }這是我能找到的C標準中唯一含糊不清的引用。涉及無符號操作數(shù)的計算永遠不會過度流動,因為無法用結(jié)果無符號整數(shù)類型表示的結(jié)果將以比結(jié)果類型可以表示的最大值大1的數(shù)量為模。我想人們可以接受這個引用來表示當右操作數(shù)較大時,操作被調(diào)整為在模數(shù)截斷數(shù)字的上下文中有意義。即0x0000 - 0x0001 == 0x 1 0000 - 0x0001 == 0xFFFF而不是使用依賴于實現(xiàn)的簽名語義:0x0000 - 0x0001 ==(無符號)(0 + -1)==(0xFFFF但也是0xFFFE或0x8001)哪種或哪種解釋是對的?是否定義了?
查看完整描述

3 回答

?
烙印99

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

在無符號類型中生成負數(shù)的減法結(jié)果是明確定義的:

  1. [...]涉及無符號操作數(shù)的計算永遠不會溢出,因為無法由結(jié)果無符號整數(shù)類型表示的結(jié)果以比模式結(jié)果類型可以表示的最大值大1的數(shù)量減少。(ISO / IEC 9899:1999(E)§6.2.5/ 9)

如您所見,(unsigned)0 - (unsigned)1等于-1模UINT_MAX + 1,或換句話說,UINT_MAX。

請注意,雖然它確實說“涉及無符號操作數(shù)的計算永遠不會溢出”,這可能導致您認為它僅適用于超出上限,但這被表示為句子的實際綁定部分的動機:“a無法用結(jié)果無符號整數(shù)類型表示的結(jié)果以模數(shù)減少為模數(shù),該數(shù)字大于可由結(jié)果類型表示的最大值。該短語不限于類型上限的溢出,并且同樣適用于太低而無法表示的值。


查看完整回答
反對 回復 2019-08-16
?
qq_花開花謝_0

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


使用無符號類型時,會發(fā)生模運算(也稱為“環(huán)繞”行為)。要理解這種模塊化算法,只需看看這些時鐘:

https://img1.sycdn.imooc.com//5d566db00001701002200096.png

9 + 4 = 1(13 mod 12),所以對另一個方向是:1 - 4 = 9(-3 mod 12)。使用無符號類型時應(yīng)用相同的原則。如果結(jié)果類型是unsigned,則進行模運算。


現(xiàn)在看一下將結(jié)果存儲為以下操作unsigned int:


unsigned int five = 5, seven = 7;

unsigned int a = five - seven;      // a = (-2 % 2^32) = 4294967294 


int one = 1, six = 6;

unsigned int b = one - six;         // b = (-5 % 2^32) = 4294967291

當您想確保結(jié)果是signed,然后將其存儲到signed變量或轉(zhuǎn)換為signed。如果想要獲得數(shù)字之間的差異并確保不應(yīng)用模運算,那么您應(yīng)該考慮使用以下abs()定義的函數(shù)stdlib.h:


int c = five - seven;       // c = -2

int d = abs(five - seven);  // d =  2

要非常小心,特別是在寫條件時,因為:


if (abs(five - seven) < seven)  // = if (2 < 7)

    // ...


if (five - seven < -1)          // = if (-2 < -1)

    // ...


if (one - six < 1)              // = if (-5 < 1)

    // ...


if ((int)(five - seven) < 1)    // = if (-2 < 1)

    // ...


if (five - seven < 1)   // = if ((unsigned int)-2 < 1) = if (4294967294 < 1)

    // ...


if (one - six < five)   // = if ((unsigned int)-5 < 5) = if (4294967291 < 5)

    // ...


查看完整回答
反對 回復 2019-08-16
?
繁星coding

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

那么,第一種解釋是正確的。但是,你在這種情況下對“簽名語義”的推理是錯誤的。

再次,你的第一個解釋是正確的。無符號算術(shù)遵循模運算的規(guī)則,這意味著對32位無符號類型0x0000 - 0x0001求值0xFFFF。

但是,第二種解釋(基于“簽名語義”的解釋)也需要產(chǎn)生相同的結(jié)果。即使您0 - 1在簽名類型的域中進行評估并獲得-1作為中間結(jié)果,-1仍然需要0xFFFF在以后將其轉(zhuǎn)換為無符號類型時生成。即使某些平臺對有符號整數(shù)使用奇異表示(1的補碼,有符號幅度),在將有符號整數(shù)值轉(zhuǎn)換為無符號整數(shù)值時,仍需要使用該平臺來應(yīng)用模運算規(guī)則。

例如,這個評估

signed int a = 0, b = 1;unsigned int c = a - b;

仍保證生產(chǎn)UINT_MAXc,即使該平臺采用異國情調(diào)的代表符號整數(shù)。


查看完整回答
反對 回復 2019-08-16
  • 3 回答
  • 0 關(guān)注
  • 1026 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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