進擊的小白Day015——char與int互相轉換
今天意外發現一個char和int互相轉換的方法,但其實到現在我還不是能夠很好的理解這個過程,所以寫寫筆記來理一下思路,花了接近一天的時間研究這個,是因為之前寫的Socket程式中用到了char和int轉換,但那裡面是用函式來實現的,而且精度有損,這個方法相比之前的來說應該是可以達到無損轉換的。今天先寫一個char和int的轉換,明天再寫一下double和int的轉換。
今天才發現,現在自己的程式設計僅僅侷限在巨集觀層面,只知道一些基本的很巨集大的東西大概該怎麼用,像函式、陣列、指標、語句,但對一些微觀層面的,比如位操作、記憶體操作這些方面欠缺很多,char和int的轉換就涉及到位操作的知識,趁機補一補。
先貼程式碼把:
#include <stdio.h> typedef unsigned char UINT8; typedef int UINT32; int main(void) { int i = 0; UINT8 msg[4]; UINT32 = 1246, dest; msg[i] = (UINT8)((src & 0xff000000) >> 24); i++; msg[i] = (UINT8)((src & 0xff0000) >> 16); i++; msg[i] = (UINT8)((src & 0xff00) >> 8); i++; msg[i] = (UINT8)(src & 0xff); i++; printf("msg[0]=%x msg[1]=%x msg[2]=%x msg[3]=%x\n", msg[0], msg[1], msg[2], msg[3]); printf("msg[0]<<24=%x msg[1]<<16=%x msg[2]<<8=%x msg[3]=%x\n", msg[0] << 24, msg[1] << 16, msg[2] << 8, msg[3]); dest = (msg[0] << 24) + (msg[1] << 16) + (msg[2] << 8) + msg[3]; printf("dest=%d\n", dest); }
分兩部分介紹,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中的數拿出來乘以量級,再相加,這裡乘量級同樣是通過為操作來實現的。
② 一個圖解釋轉換過程,依然採用大端序,高位儲存在低地址。
就此兩種轉換都已經完成,當然只是按照我自己的理解寫的,我也不確定這種理解方式是不是準確,如果有更通俗或者準確的理解再來更新,今天沒寫多少程式碼,但寫這個過程就花了接近兩個小時。以後需要加深對程式、對計算機的理解。
相關推薦
進擊的小白Day015——char與int互相轉換
今天意外發現一個char和int互相轉換的方法,但其實到現在我還不是能夠很好的理解這個過程,所以寫寫筆記來理一下思路,花了接近一天的時間研究這個,是因為之前寫的Socket程式中用到了char和int轉換,但那裡面是用函式來實現的,而且精度有損,這個方法相比之前
java中char與int的轉換問題
眾所周知,java中int型和char型資料不像c語言中那樣可以任意轉換,即不可以將一個int型變數自動轉換為char型,如下面程式碼中的演示:public class TestSort{ public static void main(String args[]){ in
一個職場小白的成長與感悟:記錄入職天搜兩個月以來的故事
天搜進入天搜已經整兩個月了,感受很多,學到很多,總覺得應該記錄下來。 老實說,能進天搜並不容易。兩輪的面試,一次比一次緊張(可能是我心裏素質的原因吧,但凡面試,都緊張)。不過說句實話,面試我的領導真的超級溫柔,屬於很平易近人那種。 面試了那麽多家公司,當時唯獨對天搜十分有好感,覺得這家公司環境特別時尚,就跟
小白入門 Shrio 與 SSM 整合使用
目錄 一、Shrio 簡介 1、什麼是 shiro ? 2、shiro 整體框架 3、shiro 認證和授權的過程 二、SSM 整合 Shiro 1、前提 2、shiro 的相關 jar 包和使用註解需要用到的 aspectj 包 3、自定義 Realm
原始碼分析所得 char 與 int之間的轉換
公司用的是 hibernate 做資料庫查詢,其中 jar 包是這些。 在翻閱原始碼的時候有些問題不得解。在不懈努力下,以及前輩大神的指導下終於明白了。 String biz_stage = "007"; StringBuilder sql1 = new StringBuil
int與String互相轉換
一、String轉為int int i=Integer.parseInt(string); int i=Integer.valueOf(s).intValue(); 二、int轉為String String s = String.valueOf(i);
JAVA中int,string,char之間的互相轉換
(1)字串string轉int: int i=Integer.parseInt(str);//使用Integer.parseInt(String str)函式,返回str所代表的int值; (2)如何
C++ 中型別轉換 xmlChar * 與Char * 轉換,Char *與int 轉換,Char *與Float轉換,int 與portNumBits轉換
使用libxml2 得到一個節點的內容: xmlChar *value = xmlNodeGetContent(node) 1、XmlChar 轉換成Char char * stream = (char *) value; 2、Char *與 int 轉換 int
char與int型的相互轉換
1、int 轉換成char: int n = 1; char ch = (char)(n + '0'); 這樣打印出來ch的值為1; 不
Java對象與JSON互相轉換jsonlib以及手動創建JSON對象與數組——(二)
ring lnl tft sem mkf ted family sae key 首先聲明一下,jsonlib轉換與GSON相比太差勁了,操作不是一般的繁瑣。GSON可以直接轉換成各種集合與對象類型。強烈推薦使用GSON。而且GSON一個方法就可以解決,
js時間與毫秒互相轉換
art rep ons 格式 date lac 得到 需要 gettime 1)日期轉換為毫秒 如果格式是:yyyy/mm/dd hh:mm:ss可以直接轉換。var oldTime = (new Date("2018/07/09 14:13:11")).getTime(
json 串與字典互相轉換
轉換 pri dump pre 解析 定義 name load import #導入json import json #定義字典 data={‘name‘:‘tom‘,‘age‘:16} #json.dumps轉換字典為json j_data=json.dumps(dat
JQuery擴展方法實現Form表單與Json互相轉換
val adjust new 映射 checked josn fin pop undefined JQuery筆記 記兩段代碼,使用JQuery實現從表單獲取json與後端交互,以及把後端返回的json映射到表單相應的字段上。 把表單轉換出json對象 //把表單
php 版本號 整數化 mysql存儲入庫 比較大小【版本處理類,提供版本與數字互相轉換】
tro mysql存儲 nload target 版本 存儲 ron 整數 php 下載地址:https://download.csdn.net/download/a724008158/10659015php 版本號 整數化 mysql存儲入庫 比較大小【版本處理類,提供版
對於Qt中QString和char*之間的互相轉換問題(系列二)
對於Qt,雖說對C++全部相容,但是一旦涉及到和介面的資料的互動操作,難免涉及到char*和QString的轉換問題,轉換的過程很簡單,這裡總結了一下網上提供的最簡單的一個方法: 從char*轉成QString型別: 使用fromLocal8Bit方法進行轉換: char * te
php圖片與base64互相轉換
/* 圖片轉化為data/base64資料流 */ function base64EncodeImage($img_file) { $img_base64 = ''; if (file_exists($img_fil
centos 中將普通使用者與 root 互相轉換
1、將普通使用者轉換成root 普通使用者的情況下 下圖所示的位置是 ” $ ” 輸入命令 ” su ” 然後輸入密碼,此時你會發現 “ $ ” 變成了 ” # “, 則說明 已經將普通使用者轉
Unicode下CString和char *之間的互相轉換
CString中儲存的字元的資料型別為wchar_t型別。 一、CString轉換為char * (1)方法一:使用wcstombs() [cpp] view plain copy print? #include <iostream>usingnamespace std; #in
資料庫遷移之-Oracle 與MySQL互相轉換
理論上來說, MySQL 已經被Oracle 收購, 這兩者之間的Migrate 應該比較容易, 但實際的遷移還是有一些問題, 以下就說一說一些實現的方式和問題。 方式一:手動方式匯入匯出 手動的方式匯入, 就是操作步驟會比較繁瑣一些。 對Table 的
String與Integer互相轉換
//String轉換Integer String str = "a"; Integer i = null; if(str!=null){ i = Integer.valueOf(str); } //方法一:Integer類的靜態方法toString(): Integer a = 2;