給乙個無符號數賦值乙個負數,並且該負數絕對值上溢,編譯器是如何處理的呢

時間 2021-06-03 06:05:17

1樓:邱昊宇

首先,對於 -257 這個字面量而言,它沒有字尾、而且是以十進位制形式書寫的:需要按照 int、long int、long long int 的順序「誰先能裝得下就是誰」,所以它的型別是 int。[1]

其次,unsigned char c = -257 屬於複製初始化。因為等號兩邊的型別都不是類,所以適用標準(隱式)型別轉換的規則。[2]也就是說我們需要將 int 型的 -257 轉換到 unsigned char 型別。

針對整型的標準型別轉換中,int 到 unsigned char 顯然是不適用整型提公升的(因為只適用於從小到大的轉換),但是適用整型轉換的規則:

If the destination type is unsigned, the resulting value is the least unsigned integer congruent to the source integer (modulo 2^n where n is the number of bits used to represent the unsigned type). [ Note: In a two's complement representation, this conversion is conceptual and there is no change in the bit pattern (if there is no truncation).

— end note ][3]

翻譯一下:

如果目標型別是無符號的,轉換結果是與原始整數一致的最小無符號整數(原始整數需要對 2^n 取模,其中 n 是無符號型別所需的位元位數)。[注:如果使用的是補碼表示,則只是概念上轉換,(如果沒有發生截斷,)實際的位元位不會發生改變。

]這裡假設 unsigned char 的長度為 8 位元位,int 長度為 16 位元位,那麼:

按照正文裡描述的操作方法:

-257 模除 2^8,取最小的非負餘數,是商 -2 餘 255

按照注釋裡補碼不變的方法:

-257 的原碼:1000 0001 0000 0001

-257 的反碼:1111 1110 1111 1110

-257 的補碼:1111 1110 1111 1111

1111 1110 1111 1111 擷取低 8 位:1111 1111

1111 1111 解釋為無符號數:255

於是,得到 c 的值是 255。

c delete乙個指標,沒有賦值為null,再建立同型別的指標,有沒有可能被釋放資源的記憶體位址被重新使用,賦值給新指標?如何用程式驗證這種可能性?這個class裡有成員是引用,引用所指的記憶體

陳章義 已釋放記憶體的重新分配是經典的ABA問題之一。會不會遇到主要取決於malloc實現,tcmalloc肯定會復用,ptmalloc不是太確定,但是它有arena,應該也是會復用記憶體的,不然頻繁觸發page fault,會帶來不必要的效能損耗。驗證很簡單,不停new delete小記憶體,把位...

標點符號是不是可以僅僅由乙個符號代替?

稽古明今 口語和書面語是有區別的。語氣 表情 肢體語言 場景中微妙的感受。這些只有說話的當事人知道,記錄到書面上就要設法反映 彌補這些資訊,標點部分能起到這樣的作用,儘管依然有損失。在中國古代,蒙學的重要內容是要明 句讀 就是會斷句。古文都是連續的文字,一句句的停頓要設法識別出來,宋朝時就有人在印刷...

喜歡乙個女孩,想送乙個iPod Nano給她,應該在背後寫什麼字?

餘喳喳 這是我的ipod.幾年前入的二手的.雖然不了解他的故事,但我當時看到刻的字時就決定買下了,覺得很有意義。我想說,刻字不low。就算後來沒有結果,也留下了美好的痕跡。大不了帶個殼嘛。 張肖琴 我男朋友送我乙個愛瘋6s玫瑰金,當時他說本來想的你過生日的時候拿來的,但想早點見到你開啟禮物的表情所以...