我知道隨著 c 20 符號幅度和一個人的比較最終被淘汰,有利于標準化兩個人的比較。(參見http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0907r3.html和http://www.open-std.org/jtc1/sc22/wg21/docs /papers/2018/p1236r1.html)我想知道這對我們現在可以在 c 20 中對整數的二進制表示做出多少假設意味著什么?當我閱讀它時,似乎已經對允許的范圍進行了很多思考,但我沒有看到任何真正表明位布局要求的東西,也沒有看到位元組序。因此,我會假設位元組順序仍然是一個問題,但是位布局呢?
根據標準,0b00000001 == 1int8_t 總是如此嗎?關于什么0b11111111 == -1
我知道在幾乎所有實際系統上,最左邊的位將是最重要的,逐漸減少,直到達到最右邊和最不重要的位元組,我測驗過的所有系統似乎都使用這種表示,但標準說關于這件事和我們得到的任何保證?或者,如果我們需要知道底層表示而不是依賴它,那么使用 256 個元素的查找表將一個位元組可以表示的每個值顯式映射到特定的位表示會更安全嗎?如果我可以直接使用位元組,我寧愿不接受查找的性能影響,但我也想確保我的代碼沒有做出太多假設,因為可移植性很重要。
uj5u.com熱心網友回復:
符號位必須是最高有效位(§[basic.fundamental]/3):
對于有符號整數型別的每個值 x,對應于 x 模 2 N的無符號整數型別的值在其值表示中具有相同的對應位值。
如果符號位是無符號中的 MSB,事情只會以這種方式作業。
這也要求(例如)uint8_t x = -1;將設定x為0b11111111(因為 -1 減少模 2 8是 255)。實際上,這在標準中用作示例:
[示例:有符號整數型別的值 -1 與相應無符號型別的最大值具有相同的表示。——結束示例]
就偏移表示而言,我認為這是不可能的。C 標準是指要求 (§6.2.6.2/1) 的 C 標準:
如果有 N 個值位,則每個位應表示 1 和 2 N-1之間的 2 的不同冪,以便該型別的物件應能夠使用純二進制表示表示從 0 到 2 N-1的值;
“使用純二進制表示”至少通常被解釋為表示如下表示:
b N b N-1 b N-2 ...b 2 b 1 b 0。
即,如果您從 0 到 N-1 計數位,則每個位代表相應的 2 的冪。
uj5u.com熱心網友回復:
C 20 標準要求有符號整數的作業方式如下:
對于有符號整數型別的每個值,與模 2 N
x一致的相應無符號整數型別的值在其值表示中具有相同的相應位值。x
這就是二進制補碼的定義方式(甚至還有一個腳注告訴你這就是這個意思)。這不允許符號位出現在有符號整數的值表示中的最高位之外的任何地方。并且這不允許轉換為無符號等效項以將該位移動到無符號等效項的值表示中最高位以外的任何位置。
二進制補碼表示二進制補碼。
根據標準,0b00000001 == 1 對于 int8_t 是否總是正確的?0b11111111 == -1 怎么樣
在表示方面,自 C 11 以來一直如此。這是因為特定大小的有符號整數型別總是要求是二進制補碼(即使signed char不是)。當然,這些型別只是可選地支持,所以如果你想要最大的可移植性,你不能依賴它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/437748.html
上一篇:遍歷所有結構成員
下一篇:如何清除C 中未初始化的記憶體?
