成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇帶給你~0 == -1 問題全解

開發 后端
今天帶大家復習一個容易遺忘的C語言知識點,負數的存儲及其一個典型考察形式。

[[380692]]

 今天帶大家復習一個容易遺忘的C語言知識點,負數的存儲及其一個典型考察形式。

我們先看一個題目

  1. #include<stdio.h> 
  2.  
  3. int main() 
  4.  int a,b,c,d;   //或者   int a,b,c,d; 
  5.  a=0x8; 
  6.  b=a>>1; 
  7.  c=~(~0<<1); 
  8.  d=b&c; 
  9.  printf("c is %d\n",c); 
  10.  printf("d is %d\n",d); 

 

解析:

假設計算機是存儲八位

  1. 0的存儲是   0b 0000 0000 
  2. ~按位取反   0b 1111 1111 
  3. 左移一位    0b 1111 1110     空檔處補0 
  4. 再按位取反  0b 0000 0001 
  5.  
  6. 所以c就等于1 

這里是一步一步推導過來的,你會忽略一個關鍵的過程,就是~0你算出來的,是0b 1111 1111,一個很大的負數,這和你以為的常理違背,我們下面討論。

再次舉例

  1. #include <stdio.h> 
  2. int main() 
  3.     printf("~0 == %d\n", ~0); 

 

  1. 0的存儲是   0b 0000 0000 
  2. ~按位取反   0b 1111 1111 

這個題目比較干脆,直接是~0 == -1,有的時候我們不明白,為什么0b 1111 1111在內存中代表-1,因為他無論如何也是一個很大的負數才對。

可是實際上,負數在內存中是按照補碼的形式存儲的,也就是說0b 1111 1111是一個補碼,那么它的反碼就是0b 1111 1110,原碼就是0b 1000 0001,也就是-1(注意負數求反碼補碼的時候符號位不變)

結論

  1. 0b 1111 1111 == -1 (~0) 
  2.  
  3. 0b 1111 1110 == -2 (~1) 
  4.  
  5. 0b 1111 1101 == -3 (~2) 

可以把它當做一個公式 ~a == -【a+1】

補充說明

為什么整數要在內存中按照補碼儲存。因為正數的原碼反碼補碼都一樣,所以我們主要討論問什么負數在內存中按照補碼方式存儲。

采用補碼的原因或好處如下,采用補碼運算具有如下兩個特征:

1)因為使用補碼可以將符號位和其他位統一處理,同時,減法也可以按加法來處理,即如果是補碼表示的數,不管是加減法都直接用加法運算即可實現。

2)兩個用補碼表示的數相加時,如果最高位(符號位)有進位,則進位被舍棄。

這樣的運算有兩個好處:

1)使符號位能與有效值部分一起參加運算,從而簡化運算規則。從而可以簡化運算器的結構,提高運算速度。(減法運算可以用加法運算表示出來)

2)加法運算比減法運算更易于實現。使減法運算轉換為加法運算,進一步簡化計算機中運算器的線路設計。

下圖最能說明為什么用補碼可以使整數的減法運算(即負數的運算)變為加法運算:


深入證明:

用帶符號位的原碼進行乘除運算時結果正確,而在加減運算的時候就出現了問題,如下:假設字長為8bits

  1. ( 1 ) - ( 1 ) = ( 1 ) + ( -1 ) = ( 0 ) 
  2. 可以表示為: 
  3. (00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 顯然不正確.。 

因為在兩個整數的加法運算中是沒有問題的,于是就發現問題出現在帶符號位的負數身上,對除符號位外的其余各位逐位取反就產生了反碼。反碼的取值空間和原碼相同且一一對應。下面是反碼的減法運算:

  1. ( 1 ) - ( 1 ) = ( 1 ) + ( -1 ) = ( 0 ) 
  2. 可以表示為: 
  3. (00000001) 反+ (11111110)反 = (11111111)反 = ( -0 ) 有問題。 
  4.  
  5. ( 1 ) - ( 2) = ( 1 ) + ( -2 ) = ( -1 ) 
  6. 可以表示為: 
  7. (00000001) 反+ (11111101)反 = (11111110)反 = ( -1 ) 正確 

問題出現在(+0)和(-0)上,在人們的計算概念中零是沒有正負之分的。

于是就引入了補碼概念。負數的補碼就是對反碼加一,而正數不變,正數的原碼反碼補碼是一樣的。在補碼中用(-128)代替了(-0),所以補碼的表示范圍為:

(-128~127)共256個。

注意:(-128)沒有相對應的原碼和反碼, (-128) = (10000000) 補碼的加減運算如下:

  1. ( 1 ) - ( 1 ) = ( 1 ) + ( -1 ) = ( 0 ) 
  2. 可以表示為: 
  3. (00000001)補 + (11111111)補 = (00000000)補 = ( 0 ) 正確 
  4.  
  5. ( 1 ) - ( 2) = ( 1 ) + ( -2 ) = ( -1 ) 
  6. 可以表示為: 
  7. (00000001) 補+ (11111110) 補= (11111111)補 = ( -1 ) 正確 

采用補碼表示還有另外一個原因,那就是為了防止0的機器數有兩個編碼。原碼和反碼表示的0有兩種形式+0和-0,而我們知道,+0和-0是相同的。這樣,8位的原碼和反碼表示的整數的范圍就是-127-127(11111111-01111111),而采用補碼表示的時候,00000000是+0,即0;10000000不再是-0,而是-128,這樣,補碼表示的數的范圍就是-128~+127了,不但增加了一個數得表示范圍,而且還保證了0編碼的唯一性。

為什么正數的反碼,補碼和原碼一樣?這是規定或者說這是約定,沒有多少道理,你算是算不出來的。

補碼只是為負數想出來的辦法,目的是減法變加法。是減法可以用加補碼的方法實現。補碼可用反碼加1得來。于是道又有了負數的反碼。

計算機里有硬件“加法器”,有了補碼,減法也可以用加法器做了。計算機里運算速度,硬件遠快于軟件。這是弄出反碼,補碼和原碼花樣的原因。

形象說明

引進補碼的作用是為了讓計算機更方便做減法,比如說,按時間12個小時來算,現在的準確時間是4點,有一個表顯示的是7點,要校準時間,我們可以將時針退7-4=3格,也可以向前撥12-3=9格,計算機做減法就可以轉化成-3=+9,這樣可以簡化計算機的硬件設備去做復雜的減法。

 

責任編輯:姜華 來源: 嵌入式Linux系統開發
相關推薦

2022-04-18 08:57:32

React 18前端

2021-07-12 06:11:14

SkyWalking 儀表板UI篇

2021-04-14 07:55:45

Swift 協議Protocol

2022-02-25 15:50:05

OpenHarmonToggle組件鴻蒙

2021-10-28 08:51:53

GPIO軟件框架 Linux

2023-03-13 09:31:04

2021-07-08 07:30:13

Webpack 前端Tree shakin

2021-05-08 08:36:40

ObjectString前端

2021-04-23 08:59:35

ClickHouse集群搭建數據庫

2021-06-21 14:36:46

Vite 前端工程化工具

2021-01-28 08:55:48

Elasticsear數據庫數據存儲

2023-03-29 07:45:58

VS編輯區編程工具

2021-04-14 14:16:58

HttpHttp協議網絡協議

2021-04-08 11:00:56

CountDownLaJava進階開發

2022-03-22 09:09:17

HookReact前端

2021-04-01 10:51:55

MySQL鎖機制數據庫

2021-03-12 09:21:31

MySQL數據庫邏輯架構

2022-02-17 08:53:38

ElasticSea集群部署

2022-04-29 14:38:49

class文件結構分析

2021-07-21 09:48:20

etcd-wal模塊解析數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产一区二区三区四区在线 | 丁香五月缴情综合网 | 黄视频免费在线 | 午夜精品一区二区三区在线播放 | 干干干操操操 | 成人免费在线观看视频 | 亚洲精品电影网在线观看 | 亚洲激精日韩激精欧美精品 | 欧美视频区 | 国产男女猛烈无遮掩视频免费网站 | 国产一级免费视频 | 一区二区福利视频 | 国产精品色哟哟网站 | 日韩一区二区在线看 | 日韩av在线一区 | 精品一区欧美 | 国产精品成人一区二区三区夜夜夜 | 成人在线欧美 | 精品国产欧美一区二区三区成人 | 久久精品| 成人毛片在线观看 | 午夜久久久 | 夜夜操天天干 | 久久综合久久久 | 精品国产乱码久久久久久牛牛 | 欧美日韩精品一区 | 亚洲欧洲中文 | 国内精品久久精品 | 欧美婷婷| 久久精品一区 | 国产乱码精品一区二区三区五月婷 | 成人在线播放 | 玩丰满女领导对白露脸hd | 久久国产成人午夜av影院武则天 | 国产专区在线 | 国产97碰免费视频 | 视频一区二区在线观看 | 久在草 | 久久国产精品一区二区三区 | 中文字幕第100页 | 免费影视在线观看 |