進擊的小白Day015 char與int互相轉換

2021-09-01 11:33:26 字數 2151 閱讀 1113

今天意外發現乙個char和int互相轉換的方法,但其實到現在我還不是能夠很好的理解這個過程,所以寫寫筆記來理一下思路,花了接近一天的時間研究這個,是因為之前寫的socket程式中用到了char和int轉換,但那裡面是用函式來實現的,而且精度有損,這個方法相比之前的來說應該是可以達到無損轉換的。今天先寫乙個char和int的轉換,明天再寫一下double和int的轉換。

今天才發現,現在自己的程式設計僅僅侷限在巨集觀層面,只知道一些基本的很巨集大的東西大概該怎麼用,像函式、陣列、指標、語句,但對一些微觀層面的,比如位操作、記憶體操作這些方面欠缺很多,char和int的轉換就涉及到位操作的知識,趁機補一補。

先貼**把:

#include typedef unsigned char uint8;

typedef int uint32;

int main(void)

分兩部分介紹,int→unsigned char和unsigned char→int,先說一下,unsigned char是1個位元組,int是4個位元組。(以下unsigned char將用uint8代替,int用uint32代替)

uint32→uint8

① 這部分是將乙個uint32型數轉化為uint8陣列

② 《和》是位操作符,在c語言中沒有二進位制的表示方式,但計算機本來只有0和1兩個數字,也就是二進位制,所以我的理解是,一旦涉及到計算機操作,比如位操作,數值將自動轉化成二進位制,不需要再用語言進行描述表示。

③ 4位元組的uint32型數值放到單個元素1位元組的uint8陣列中,可以理解為「4位元組→4×1位元組」,即將4位元組的uint32型拆分成4×1個位元組,分別存到uint8陣列的四個元素中。

④ uint32為4位元組=32位,因此1個位元組=8位,採用大端序進行儲存,即高位存在低位址。劇透以下,1246對應的二進位制是10011011110,把所有0都補全的話是00000000000000000000010011011110,但通常前面多餘的0是不加的,這裡寫上是為了下面的圖更清晰一些。

⑤ 大端序就是把高位儲存到低位址,即把最左邊的「0000 0000」儲存在msg[0]裡面,採用位操作提取uint32中的這個位元組,如圖,src向右位移24位,藍色為要提取的值,綠色為位移後自動新增的值,紅色為位移後被捨棄的值,這麼看其實最後得到的值依然是4位元組,但其實由於位移24位之後,新新增的(綠色)的值肯定為0,可以捨棄,通過強制型別轉換(uint8)(src >> 24)可以讓位移後的四位元組只保留最後的乙個位元組(藍色)。

⑥ 高位低位元組的提取也是一樣的道理,由於最後結果依舊為0,就不演示了。

⑦ 第三位的提取再來演示一下,藍色為需要提取的位元組,綠色為新增,紅色為捨棄,最終,將二進位制數「100」存在msg[2]中。

⑧ 最後一位不需要位移就可以提取。

⑨ 這裡講一下(uint8)((src & 0xff000000) >> 24)中的「& 0xff000000」,這個操作是「按位與」,是為了將除要提取的位元組之外其他的位元組都置0,但由於在這條語句中不管是提取位元組之前還是之後,要麼刪除要麼增0,因此這個操作看似無用,但在其他特殊的時候,是有必要的。

⑩ 最終在msg中儲存的資料分別為,msg[0]=『0』,msg[1]=『0』,msg[2]=『4』,msg[3]=『de』,資料以16進製制的形式儲存,就此實現uint32→uint8,即int→unsigned char的轉換。

uint8→uint32

① 這部分就相對簡單一些了,就是把存在msg中的數拿出來乘以量級,再相加,這裡乘量級同樣是通過為操作來實現的。

② 乙個**釋轉換過程,依然採用大端序,高位儲存在低位址。

就此兩種轉換都已經完成,當然只是按照我自己的理解寫的,我也不確定這種理解方式是不是準確,如果有更通俗或者準確的理解再來更新,今天沒寫多少**,但寫這個過程就花了接近兩個小時。以後需要加深對程式、對計算機的理解。

進擊的小白Day012 遺傳演算法(一)

今天寫個遺傳演算法的程式,例子很簡單,y x 3,x 0,101 求y最大時x的值,今天實現到累積概率的計算。貼 include include include include define m 6 種群規模 十進位制轉二進位制 int transform int n return result 產...

進擊的小白Day021 遺傳演算法(三)

這次不在上次的基礎上改了,先自己根據流程 寫一遍,然後再優化修改。遺傳演算法概念及流程 1 問題描述 求極小值。2 概念介紹 1 種群 個體 染色體 基因 數學模型的乙個可行解成為一條染色體 也可以稱之為個體 乙個可行解有多個元素組成,因此每個元素成為乙個基因,一組 人為設定值,用n表示 可行解組合...

進擊的小白Day006 計算器(二)(完結)

今天的第一篇是用來補昨天的,不知道為啥昨天寫的沒有儲存。今天寫的比較少,只是在原來的基礎上夾了乙個冪乘,修復了選擇運算模式的時候輸入浮點數出錯的問題,然後把所有整形運算擴充到可以進行浮點運算。貼 define crt secure no warnings 預定義常量,解決scanf不安全的報錯,需要...