[c++]-uint8_t,uint16_t,uint32_t,uint64_t代表含义及其标准定义

本文介绍了C++的基础数据类型,包括布尔型、整型和浮点型,并详细讲解了C99标准中的uint8_t、uint16_t、uint32_t和uint64_t等无符号整型别名。通过实例展示了这些类型在存储ASCII码、变量转换为字符串以及字符串转换回变量时的行为。强调了uint8_t实际为char类型,存储ASCII码时会输出对应字符。

c++基础数据类型

首先来看一张c++基础数据类型的列表

下表显示了各种变量类型在内存中存储值时需要占用的内存,以及该类型的变量所能存储的最大值和最小值。

注意:不同系统会有所差异,一字节为 8 位。

注意:long int 8 个字节,int 都是 4 个字节,早期的 C 编译器定义了 long int 占用 4 个字节,int 占用 2 个字节,新版的 C/C++ 标准兼容了早期的这一设定。
在这里插入图片描述
详解:菜鸟教程-c++数据类型

总的来说c++的基础数据类型分为三类:

  • 布尔型
  • 整型(char型从本质上说,也是种整型类型,它是长度为1个字节的整数,通常用来存放字符的ASCII码)
  • 浮点型

uint8_t/uint16_t/uint32t/uint64_t是什么

首先要声明一点*_t是typedef定义的表示标志,是一种规范化的表示。
uint8_t/uint16_t/uint32t/uint64_t都不是新的数据类型,而是通过typedef给类型起的别名
这些数据类型都是在C99标准中定义的,具体如下:

/* 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;),存储的是ascii码。

  • 输出uint8_t 类型的变量实际输出的是其对应的字符, 而不是真实数字
#include <iostream>
#include <cstdint>

using namespace std;

int main() {
  uint8_t a = 65;
  cout << a << endl;
}
out: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;
}
out:
A

6

66

66
### `UINT64` 与 `uint64_t` 的区别与使用场景 在 C/C++ 编程中,`uint64_t` 是标准定义的 64 位无符号整数类型,而 `UINT64` 通常是一个宏,用于表示 64 位无符号整数的常量值或类型别名。它们在语义、可移植性和使用方式上存在显著差异。 #### `uint64_t` 的定义与优势 `uint64_t` 是 C99 标准定义标准类型,确保在所有支持的平台上都表示一个 64 位无符号整数。该类型定义在 `<stdint.h>`(C)或 `<cstdint>`(C++)头文件中。其优势在于跨平台的一致性,使开发者能够编写可移植性强的代码[^1]。 例如,在 64 位系统上,`uint64_t` 可能被定义为: ```c typedef unsigned long int uint64_t; ``` 而在 32 位系统上,它可能被定义为: ```c typedef unsigned long long int uint64_t; ``` 这种统一的接口确保了开发者无需关心底层数据类型的实现细节,即可编写兼容性强的代码[^2]。 #### `UINT64` 的含义与用途 `UINT64` 通常是一个宏,用于表示 64 位无符号整数的常量值。例如,在某些系统中,`UINT64` 可能定义如下: ```c #define UINT64(x) ((uint64_t)(x)) ``` 它的主要用途是在代码中明确表示某个常量是 64 位整数,以避免类型推断错误。例如: ```c uint64_t value = UINT64(1) << 32; ``` 这种方式确保编译器将 `1` 视为 64 位整数,避免在左移操作中发生溢出或类型截断问题[^3]。 #### 使用场景对比 - **`uint64_t` 的典型使用场景** `uint64_t` 适用于需要精确控制数据宽度的场景,如网络协议解析、硬件寄存器访问、加密算法实现等。它确保在不同平台上数据结构的大小一致,避免因类型宽度差异导致的错误[^1]。 - **`UINT64` 的典型使用场景** `UINT64` 通常用于常量表达式中,确保常量以 64 位形式参与运算。例如,在位操作、大整数赋值、位掩码定义等场景中,使用 `UINT64` 可以避免因默认整数类型宽度不足而导致的错误[^3]。 #### 示例代码 以下代码展示了 `uint64_t` 和 `UINT64` 的结合使用: ```c #include <stdint.h> #include <stdio.h> #define UINT64(x) ((uint64_t)(x)) int main() { uint64_t a = UINT64(1) << 40; // 确保 1 是 64 位整数 uint64_t b = UINT64(0xFFFFFFFFFFFFFFFF); // 表示最大 64 位无符号整数值 printf("a = 0x%lx\n", a); // 输出 0x1000000000 printf("b = 0x%lx\n", b); // 输出 0xFFFFFFFFFFFFFFFF return 0; } ``` 该示例确保在 32 位和 64 位系统上都能正确执行 64 位整数运算。 #### 总结 - `uint64_t` 是标准定义的 64 位无符号整数类型,适用于跨平台开发。 - `UINT64` 是一个宏,用于将常量转换为 64 位整数,确保运算的正确性。 - 在实际开发中,两者通常结合使用,以确保类型安全和运算正确性。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值