Qt總結之十四:uint8_t / uint16_t / uint32_t /uint64_t資料型別詳解
一、C++基礎資料型別
(一)如下圖
C++的主要資料型別,主要分為三類:布林型,整型(char型從本質上說,也是種整型型別,它是長度為1的整數,通常用來存放字元的ASCII碼),浮點型。
(二)byte(位元組)和bit(位)
普及如下:
byte為位元組,bit為位,1byte=8bit
這兩者應用的場合不同。通常用bit來作資料傳輸的單位,因為物理層,資料鏈路層的傳輸對於使用者是透明的,而這種通訊傳輸是基於二進位制的傳輸。在應用層通常是用byte來作單位,表示檔案的大小,在使用者看來就是可見的資料大小。比如一個字元就是1byte,如果是漢字,則是2byte。
Bit意為“位”或“位元”,是計算機運算的基礎,屬於二進位制的範籌;
Byte意為“位元組”,是計算機檔案大小的基本計算單位;
(三)ASCII,Unicode和UTF_8之間的前生後世
https://blog.csdn.net/Aidam_Bo/article/details/85780365
二、uintx_t
而 *_t是typedef定義的表示標誌,是結構的一種標註。即我們所看到的 uint8_t、uint16_t、uint32_t都不是新的資料型別,而是通過typedef給型別起得別名。(如C語言中沒有bool型別,有的程式設計師用int表示,有的用short表示,則利用統一的定義來表示bool,是比較好的。typedef char bool)。
來看官方給我們的 typedef:
/* stdint.h standard header */ #pragma once #ifndef _STDINT #define _STDINT #ifndef RC_INVOKED #include <crtdefs.h> typedef signed char int8_t; typedef short int16_t; typedef int int32_t; typedef long long int64_t; /*Unsigned*/ typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef unsigned long long uint64_t;
則很明顯的看出:uint8_t是用1個位元組表示的;uint16_t是用2個位元組表示的;uint32_t是用4個位元組表示的。
則對應的輸出為:
uint16_t %hu
uint32_t %u
uint64_t %llu
注意:
必須小心 uint8_t 型別變數的輸出,例如如下程式碼,會輸出什麼呢?
uint8_t fieldID = 67;
cerr<< "field=" << fieldID <<endl;
結果發現是:field=C 而 不是我們所想的 field=67
這是由於 typedef unsigned char uint8_t;
uint8_t 實際是一個 char, cerr << 會輸出 ASCII 碼是 67 的字元,而不是 67 這個數字.
因此,輸出 uint8_t 型別的變數實際輸出的是其對應的字元, 而不是真實數字.
若要輸出 67,則可以這樣:
cerr<< "field=" << (uint16_t) fieldID <<endl;
結果是:field=67
同樣: uint8_t 型別變數轉化為字串以及字串轉化為 uint8_t 型別變數都要注意, uint8_t型別變數轉化為字串時得到的會是ASCII碼對應的字元, 字串轉化為 uint8_t 變數時, 會將字串的第一個字元賦值給變數.
例如如下程式碼:
#include <iostream>
#include <stdint.h>
#include <sstream>
using namespace std;
int main()
{
uint8_t fieldID = 67;
// uint8_t --> string
string s;
ostringstream strOStream;
strOStream << fieldID;
s = strOStream.str();
cerr << s << endl;
// string --> uint8_t
s = "65";
stringstream strStream;
strStream << s;
strStream >> fieldID;
strStream.clear();
cerr << fieldID << endl;
}
上述程式碼輸出的是:
C
6