C 中對於 FFFFFFFF 若表示有符號整數則為 1。這句話咋理解?

時間 2021-06-02 21:49:12

1樓:

你這是使用16進製表示C++ int型別的-1的實際儲存值。

你需要了解一下知識點:

補碼是什麼,有什麼用;

如何計算乙個負數的補碼;

1個位元組的char的-1的補碼是什麼?4個位元組的int的-1的補碼是什麼?8個位元組的long的-1是什麼?

你可以開啟win10自帶的計算器,用於驗證:

這是2個byte型別的,通過切換「WORD」鍵,就可以看到其他型別-1的值;

這個計算器會顯示三種不同進製的值:HEX DEC OCT BIN,分別是16,10,8,2進製。

學習理論後,通過該計算器進行計算驗證,可以加深理解。

2樓:濤滔不絕

你這個東西不是16啊。

從二進位制開始說:乙個二進位制數,最高位是符號位,如果為零則是正數,為一則是負數,比如1000 0101(-5)這樣的表示方法叫原碼。

但這種方法不適合計算,計算機不會算減法,或者你用原碼方式設計的的機器會非常麻煩。就有了另一種方式——反碼:正數的原碼等於反碼,負數的反碼是除了符號位一外按位取反,比如剛才的負五就是1111 1010。

但是直接計算會出bug,就是1111 1111加0000 0001等於0000 0000,-0+1=0的情況,為什麼,因為實際上數軸是關於原點0對稱的,而這個,有兩個0,對稱軸則是兩個零之間不存在的乙個數。

如果看懵了就直接朝下看,為了消除乙個0,負數有了補碼:負數是在反碼的基礎上+1,正數原碼反碼補碼都相等。不舉例子直接計算:

1111 1101(-3)+0000 0101直接算出來0000 0010,這個二注意是補碼,但正數原反補相等;1111 1011+1111 1101=1111 1000,然後把補碼結果轉原碼按位取反再加一(注意順序)1000 1000(-8)。

原碼好處是方便讀數,反碼只是個過渡,補碼雖然麻煩但可以直接機械性的計算,如果對於計算機,輸入輸出統一用補碼,那麼加減法複雜度則沒有任何區別(在十進位制輸入轉二進位制編碼時的二進位制數就用了補碼。

對應的數電電路就不說了,你的十六進製制只是表示了乙個數字在數值上的結果,在正負表達方面還不如在十六進製制數前面加乙個負號。如果真要這麼表示,就是乙個補碼,把它用二進位制表示出來。八個F就是四個位元組的1,就是-1的補碼,表示-1。

C 中void main()到底是表示什麼啊?初學C ,不太了解,忘各路大神解釋。?

孤獨的喬治 main函式是入口點,即程式從這裡開始執行。void表示函式沒有返回值,若是int main 則要有int型別的值返回 周航 表示錯誤 現在c 入口只有三種寫法 int main void 等價於int main c 中函式 與 void 一樣,而c語言則不是 int main int ...

對於 C 中的輸入引數,使用 const string 還是 const char 好?

nevermore 想太多,就這種簡單的型別轉換,cpu一秒鐘能做幾百萬次,壓根不影響效能。程式開發的時候放在第一位的一定是健壯性,你要相信編譯器 標準庫一定比你水平高,用string自動管理記憶體一定比你用裸指標char 更安全,還能讓你後期除錯的時候節省不少頭髮 餘朔鈺 看業務場景了。對於cli...

HTTPS體系中若攻擊者將自己公鑰上傳CA得到簽名,並將兩者一起用於篡改證書的中間人攻擊會怎樣?

slump slump 今天在閱讀 Real World Cryptography 中看到了這個場景,Let s Encrypt最初的ACME協議中存在漏洞,可以讓攻擊者在沒有網域名稱控制權的情況下,獲得網域名稱證書的簽名,詳細資訊參見 Cryptographic Signatures,Surpri...