日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
從Go語言角度剖析關(guān)于計(jì)算機(jī)位的問題

[[376392]]

 前言

Hey,大家好呀,我是碼農(nóng),星期八!

最近在學(xué)習(xí)關(guān)于逆向的一些玩意,發(fā)現(xiàn)逆向不得不說都是些玩底層的玩意。

在學(xué)習(xí)的過程中,發(fā)現(xiàn)了一個(gè)其實(shí)在正向開發(fā)中也用的很多的底層知識(shí)點(diǎn),就是位和字節(jié)。

比如一個(gè)數(shù)字a究竟是怎么存在內(nèi)存中的。

一段代碼

本次就以Go語言舉例,Go語言是類C語言,一些底層還是很相近的!

代碼

 
 
 
 
  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "unsafe" 
  6.  
  7. func main() { 
  8.     //定義一個(gè) 字符a 
  9.     var a = 'a' 
  10.     //定義一個(gè) 正 整數(shù)3 
  11.     var b uint8 = 3 
  12.     var c uint8 = 98 
  13.     fmt.Printf("值:%c,十進(jìn)制:%d,類型:%T,二進(jìn)制:%b,大小%v字節(jié)\n", a, a, a, a, unsafe.Sizeof(a)) // 4個(gè)字節(jié) 
  14.     fmt.Printf("值%d,十進(jìn)制:%d,類型:%T,二進(jìn)制%b,大小%v字節(jié)\n", b, b, b, b, unsafe.Sizeof(b))   //一個(gè)字節(jié) 
  15.     fmt.Printf("值%c,十進(jìn)制,%d,類型:%T,二進(jìn)制%b,大小%v字節(jié)\n", c, c, c, c,unsafe.Sizeof(c))      //一個(gè)字節(jié) 

執(zhí)行結(jié)果

有幾個(gè)問題

我a變量命名時(shí)字符a,為什么十進(jìn)制是97,二進(jìn)制是1100001?

為什么變量c命名是98,卻能輸出b?

位和字節(jié)

要像理解上述問題,還是要理解本質(zhì)問題。

我們的程序,終究是跑在內(nèi)存中的。

而我們的內(nèi)存條,大概是這樣。

內(nèi)存條的本質(zhì),本質(zhì)就是一個(gè)個(gè)的電子元件,終究只有兩種狀態(tài),通電(1),沒通電(0)。

一個(gè)電子元件,就是一個(gè)位。

字節(jié)

而一個(gè)字節(jié),等于8位,1字節(jié)=8位 。

 

一位,就是一個(gè)0或1,就是二進(jìn)制,非0即1。

一個(gè)字節(jié),就是8個(gè)0或1,就像這樣,00000000,如果看到不足8個(gè)0或1,將前面都補(bǔ)成0,補(bǔ)夠8位。

通常情況下,語言一般只操作到字節(jié),很少操作到位。

為什么a是97

雖然上述我們知道了,一個(gè)位表示的就是一個(gè)通電或者沒通電的電子元件。

一個(gè)字節(jié)表示的是8個(gè)通電或者沒通電的電子元件的組合。

但是這樣并沒有解決實(shí)際問題啊,我想存一個(gè)10,在加上一個(gè)20,進(jìn)行加法計(jì)算,咋辦???

所以這時(shí)候,就要有一個(gè)什么規(guī)定,哪個(gè)亮,或者哪個(gè)不亮,就表示是什么。

所以就有了ASCII這個(gè)規(guī)范,這個(gè)規(guī)范的最小單位是字節(jié),也就是同時(shí)管理8個(gè)0或1。

比如說,第一個(gè)字節(jié),就是前八位,如果說全部都是0,就表示的是十進(jìn)制數(shù)字0。

8個(gè)二進(jìn)制表示方式是00000000。

又規(guī)定,從末尾開始計(jì)算,如果末尾亮了,其他7個(gè)沒亮,表示十進(jìn)制1。

00000001

等等等等,通過字節(jié)組織位,通過每8位不同的組合,表示不同的符號(hào)或者數(shù)字或者字母等。

具體二進(jìn)制對(duì)應(yīng)的符號(hào)或者數(shù)字:https://baike.baidu.com/item/ASCII/309296?fromtitle=ASCII%E7%BC%96%E7%A0%81&fromid=3712529&fr=aladdin

通過查詢ASCII可知。

字母a的二進(jìn)制是0110 0001,十進(jìn)制是97,表示的符號(hào)是a。

所以就和開頭對(duì)上咯!

為什么98能輸出b,還是因?yàn)锳SCII,因?yàn)?8代表的就是字母b,就是二進(jìn)制0110 0010。

只不過是輸出方式不一樣。

目前的編碼方向

其實(shí)一個(gè)字節(jié),8位,如果全部亮燈,就是11111111,他的十進(jìn)制是255,理論來說是可以支持255個(gè)符號(hào)的。

對(duì)于英語的國(guó)家應(yīng)該是湊合了,一個(gè)字母8位,一個(gè)字節(jié),存一個(gè)hello就是5個(gè)字節(jié),一共需要40位就足夠了。

但是現(xiàn)如今,計(jì)算機(jī)早已經(jīng)成為一顆參天大樹,中國(guó)再用,小日本再用,棒子再用,各國(guó)的文字加起來早都不是255個(gè)那么簡(jiǎn)單了。

所以衍生出像中國(guó)的GBK等一些編碼,各種編碼都是基于ASCII擴(kuò)充的。

ASCII占一個(gè)字節(jié),8位,那我GBK不夠啊,幾萬個(gè)漢字呢,那我占倆字節(jié),16位,16個(gè)0或者1,應(yīng)該湊合吧,再不行三個(gè)字節(jié),24個(gè)0或1,三個(gè)字節(jié)十進(jìn)制就已經(jīng)到16777215了,上千萬了,足夠保存各國(guó)的符號(hào)和文字了。

但是GBK和其他編碼又不通用,所以現(xiàn)在又衍生出utf-8等編碼收錄各國(guó)的編碼。

目前utf-8是一個(gè)最好的編碼,基本已經(jīng)支持所以計(jì)算機(jī)。

總結(jié)

本篇主要是理解計(jì)算機(jī)內(nèi)存的本質(zhì),1字節(jié)=8位,1位=一個(gè)通電or沒通電的電子元件,通過不同的00101010表示不同的符號(hào)。

經(jīng)過這么多年的發(fā)展,utf-8已經(jīng)很成熟,目前趨勢(shì)很穩(wěn)定。

 


當(dāng)前文章:從Go語言角度剖析關(guān)于計(jì)算機(jī)位的問題
文章起源:http://m.5511xx.com/article/dpccjed.html