簡體   English   中英

計算機如何將二進制數轉換為2的補碼中的十進制等值

[英]How does the computer converts binary number into its decimal equivalent in 2's complement

(我的問題只與2的補碼有關)

假設我給你這個二進制數11111110,它在機器上存儲為二進制補碼,我希望你找到它的十進制等值。 有些人可能會說它是-2而有些人可能會說這是254,因為他們不知道是簽名還是未簽名。 (我知道這是一個有符號的數字,所以我拿了它的補碼並加了1給了我2,所以答案是-2。但如果我不知道這個標志,我會說254)。

簡而言之,計算機如何將存儲在2的補碼中的二進制表示轉換為其十進制等值而不會出錯?

電腦是否知道它的標志? (如果是,那么這些信息存儲在哪里?)

從技術上講,您不能二進制表示的數字轉換為小數,因為計算機沒有任何存儲工具來表示十進制數。

實際上這可能聽起來很荒謬,因為我們總是處理十進制表示中的數字。 但這些十進制表示實際上從未以十進制形式存儲。 計算機所做的只是在顯示數字時將數字轉換為十進制表示。 這種轉換與程序構建和庫設計有關。

我將舉一個關於C語言的小例子。 在C中,您有有符號和無符號整數變量。 在編寫程序時,這些變量用於在內存中存儲數字。 誰知道他們的跡象? 編譯器。 匯編語言具有簽名和未簽名的操作。 編譯器跟蹤所有變量的符號,並為簽名和未簽名的案例生成適當的代碼。 因此,在編譯時,您的程序可以完美地使用有符號或無符號整數。

假設您使用printf語句打印整數變量,並使用%d格式轉換器以十進制表示形式打印值。 此轉換將由printf標准輸入輸出庫中定義的printf函數處理。該函數從內存中讀取變量,使用簡單的基本轉換算法將二進制表示轉換為十進制表示。 但算法的目標是char序列,而不是整數。 所以這個算法做了兩件事,它將二進制轉換為十進制表示; 它將位轉換為char值(或ASCII碼更精確)。 printf應該知道要成功進行轉換的數字的符號,這個信息再次由編譯時放置的編譯器結構提供。 通過使用這些構造, printf可以檢查整數是有符號還是無符號,並使用適當的轉換方法。

其他編程語言遵循類似的路徑。 本質上,數字總是以二進制形式存儲。 簽名或無符號表示由編譯器/解釋器知道,因此是常識。 十進制轉換僅出於美觀的原因而進行,轉換目標是char序列或字符串。

這是因為當您指定要使用帶符號的數字時,計算機會將第一位[1]1111110為從其余位1[1111110]得到的數字的符號。 所以1表示 - 而0表示+; “char”可以存儲-127到127之間的數字; “unsigned char”可以存儲0到255之間的數字;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM