[英]Finding the difference between a negative and positive binary Number
我知道我們可以用多種方式表示二進制數,但我真的不確定如何區分正二進制數和負數。
如果我們有數字+13
,那么它的二進制表示如下: 1101
它的負面表現是這樣的:
11101
我的理解是,如果您需要區分它們,那么0
在數字+13
中的存在很重要:
01101
即便如此,我仍然無法區分:
11101 ///Here is the representation of -13
和:
11101 ///Here is the representation of +29
我知道這里使用了另一種稱為“二進制補碼”的方案,我需要應用它。
我如何區分這兩種二進制表示形式?
就像其他人說的那樣,這個問題我可以區分這兩種二進制表示形式沒有任何意義。 位序列是中性的,將其轉換為數字時,將對給定表示進行轉換。 它可以表示一個int ,一個unsigned int ,一個float或任何您想要的東西。 就像我問你是什么硬幣 ,這個詞在英語和法語中存在(至少是?),其含義完全不同(法語單詞coin表示英語中的角 ),要回答我,您需要選擇一種語言,您將無法回答。
關於“二進制補碼”,它是與我們的CPU中用於更改signed int的符號的標准表示方式兼容的方式。 第一個補碼是將所有0都替換為1,將所有1都替換為0, 第二個補碼是將1加上前一個結果。
假設該字具有5位,則int值13的二進制值為01101。 如果我們要-13,則13的第一個補碼為10010,加1則為10011。
但是仍然有5位字, 無符號int的 10011對應於值19。
對於5位整數 ,如果我們嘗試更改其符號,則較低的負數根據定義為10000:第一個補碼= 01111,加1 = 10000! 實際上有一個溢出,5位是不夠的。
基於上下文,相同的位序列可能具有根本不同的含義。
整數類型具有固定的位數-C語言定義要求帶符號的int
類型必須至少能夠表示范圍[-32,767...32,767]
,這意味着int
必須至少為 16位寬1 。
有幾種不同的方式來表示有符號整數。 最常見的是2的補碼,但是某些架構可能使用1的補碼或符號幅度。
要在2的補碼上翻轉符號,請按位取反並加1(此示例假定8位整數):
00001101 == 13
11110010 + 1 == 11110011 == -13
11110011 == -13
00001100 + 1 == 00001101 == 13
2的補碼的主要優點之一是您具有0的單一表示形式,並且為您提供了稍寬的值范圍- [-2 n-1 ..2 n-1 -1]
- [-2 n-1 ..2 n-1 -1]
要在1的補碼上翻轉符號,只需執行按位取反操作即可:
00001101 == 13
11110010 == -13
11110010 == -13
00001101 == 13
隨着1的補,你有積極和消極的表示,0 - 00000000
和11111111
- ,范圍為[-2 n-1 -1..2 n-1 -1]
使用符號幅度時,將值位保持不變,並翻轉符號位:
00001101 == 13
10001101 == -13
像1的補碼一樣,您將獲得正負00000000
和10000000
兩種編碼。
無符號整數類型與有符號整數具有相同的寬度,其范圍為[0..2 n -1]
。
因此,位序列11110011
可以表示2的補碼中的11110011
的補碼中的-12,符號幅度為-115或243無符號。
假設您有 5 位計算機。 5 位分為 1 個符號位 + 4 個數字位。 限制是 2^4-1 到 -2^4,即 15 到 -16。 13=01101 -13= 10010:2的補碼表示。 它不會是 18,因為 18 不適合該范圍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.