先从c++的基础数据类型说起
C++的基础数据类型列表:
总的来说c++的基础数据类型分为三类:
- 布尔型
- 整型(char型从本质上说,也是种整型类型,它是长度为1个字节的整数,通常用来存放字符的ASCII码)
- 浮点型
uint8_t/uint16_t/uint32t/uint64_t是什么
首先,要明确一点:*_t是typedef定义的表示标志,是一种表示规范。
因此,我们所看到的 uint8_t、uint16_t、uint32t、uint64_t都不是新的数据类型,而是通过typedef给类型起得别名。
这些数据类型是 C99 中定义的,具体定义在:/usr/include/stdint.h文件中。
/* There is some amount of overlap with <sys/types.h> as known by inet code */
#ifndef __int8_t_defined
# define __int8_t_defined
typedef signed char int8_t;
typedef short int int16_t;
typedef int int32_t;
# if __WORDSIZE == 64
typedef long int int64_t;
# else
__extension__
typedef long long int int64_t;
# endif
#endif
/* Unsigned. */
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
#ifndef __uint32_t_defined
typedef unsigned int uint32_t;
# define __uint32_t_defined
#endif
#if __WORDSIZE == 64
typedef unsigned long int uint64_t;
#else
__extension__
typedef unsigned long long int uint64_t;
#endif
需要注意的是:uint8_t 实际是一个 char。(typedef unsigned char uint8_t;)
- 输出 uint8_t 类型的变量实际输出的是其对应的字符, 而不是真实数字。
#include <iostream>
#include <cstdint>
using namespace std;
int main() {
uint8_t a = 65;
cout << a << endl;
}
输出:A
- uint8_t类型变量转化为字符串时得到的会是ASCII码对应的字符, 字符串转化为 uint8_t 变量时, 会将字符串的第一个字符赋值给变量。
#include <iostream>
#include <cstdint>
#include <sstream>
using namespace std;
int main() {
uint8_t a = 65;
// uint8_t -> string
string str;
ostringstream oss;
oss << a;
str = oss.str();
cout << str << endl;
// string -> uint8_t
str = "65";
stringstream ss;
ss >> a;
ss.clear();
cout << a << endl;
uint32_t b = 66;
// uint32_t -> string
string str2;
ostringstream oss2;
oss2 << b;
str = oss2.str();
cout << str2 << endl;
// string -> uint32_t
str = "66";
stringstream ss2;
ss2 << str;
ss2 >> b;
ss2.clear();
cout << b << endl;
}
输出:A
6
66
66