1. 程式人生 > >進擊的小白Day015——char與int互相轉換

進擊的小白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代替)

  1. 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的轉換。
  2. UINT8→UINT32
    ① 這部分就相對簡單一些了,就是把存在msg中的數拿出來乘以量級,再相加,這裡乘量級同樣是通過為操作來實現的。
    ② 一個圖解釋轉換過程,依然採用大端序,高位儲存在低地址。
    在這裡插入圖片描述

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

相關推薦

進擊Day015——charint互相轉換

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

java中charint轉換問題

眾所周知,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

intString互相轉換

一、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

charint型的相互轉換

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 的

StringInteger互相轉換

//String轉換Integer String str = "a"; Integer i = null; if(str!=null){ i = Integer.valueOf(str); } //方法一:Integer類的靜態方法toString(): Integer a = 2;