1. 程式人生 > >Qt總結之十四:uint8_t / uint16_t / uint32_t /uint64_t資料型別詳解

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