Qt总结之十四:uint8_t / uint16_t / uint32_t /uint64_t数据类型详解

版权声明:最终版权归YBAidam所有 https://blog.csdn.net/Aidam_Bo/article/details/85775846

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

猜你喜欢

转载自blog.csdn.net/Aidam_Bo/article/details/85775846