详解C语言中的int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t

2023年8月8日,周二上午


目录


为什么会产生int8_t、uint8_t等这类数据类型

根本原因在于,C 语言标准只是规定了各个基本类型的最小字节长度,但并没有指定它们的确切字节长度:

  • char 类型: char 类型的最小大小为 1 字节,用来存储字符的基本类型。

  • short 类型: short 类型的最小大小为 2 字节,用来存储短整数的基本类型。

  • int 类型: int 类型的最小大小为 2 字节,用来存储整数的基本类型。

  • long 类型: long 类型的最小大小为 4 字节,用来存储长整数的基本类型。

  • long long 类型: long long 类型的最小大小为 8 字节,用来存储超长整数的基本类型。

比如,

在64位Windows上运行C语言的sizeof(long)得到的是4

在64位Linux上运行C语言的sizeof(long)得到的是8

虽然不一样,但它们都不会小于4字节

再比如,

在某些平台上运行C语言的sizeof(int)得到的是2

在64位和32位Windows上运行C语言的sizeof(int)得到的是4

虽然不一样,但它们都不会小于2字节

总而言之,C语言现有的基本数据类型,不能满足跨平台的需求。

因为C语言现有的基本数据类型在不同的平台有不同的字节长度,当换一个平台时可能会在数据大小方面出现问题。

int8_t、uint8_t等这类数据类型有什么用

Integer type with a width of exactly 8, 16, 32, or 64 bits.

具有精确位宽的8位、16位、32位或64位整型

也就是说,无论在什么平台,无论用什么编译器,只要是遵守C语言标准的,

int8_t和uint8_t一定是8位的整型,

int16_t和uint16_t一定是16位的整型,

int32_t和uint32_t一定是32位的整型,

int64_t和uint64_t一定是64位的整型

头文件

在C语言中,它们定义在stdint.h

在C++中,它们定义在cstdint

int8_t、uint8_t等这类数据类型是怎么实现的

我研究了几个小时也没能彻底弄懂,感觉没那么简单,还是挺复杂的,

其实也不用研究这些,知道怎么用、为什么要用就可以了,

不建议去研究这个....

 

 

`uint32_t modbus_deal(uint8_t *tx_buf, uint8_t *rx_buf, uint32_t len)` 这段代码定义了一个函数,用于处理Modbus通信协议的数据包。Modbus是一种工业现场总线通信协议,主要用于设备间的数据交换。在这个函数中: 1. `tx_buf` 是一个指向输入字节缓冲区的指针,通常用于构建将要发送的Modbus请求报文。 2. `rx_buf` 同样是一个指针,接收从 Modbus 设备返回的响应数据。 3. `len` 参数表示数据包的长度。 发送 13 07 00 00 00 00 00 00 02 00 CRC 的步骤可能会是这样的: - 第 1 字节(高位字节):通常是 Modbus 请求的功能码(如读寄存器请求,其十六进制值为 0x03 或者十进制 3); - 第 2 字节:功能码的低位字节; - 第 3 到第 5 字节:寄存器地址,这里假设我们想读取的寄存器起始地址为 0x0000; - 第 6 到第 9 字节:如果只读取一个寄存器,则填充零(因为读单个寄存器用 1 个字节),如果是读多个则需要更多; - 第 10 字节:数据长度,由于是读操作且未指定读多少,通常设置为 00(读取一个字节); - 最后的两个字节(CRC校验和,Computed Checksum):这是为了保证数据传输的准确性,由 Modbus 协议计算得出,实际值会依赖于前面的数据内容。 至于具体的CRC算法计算,你需要使用一个专门的库函数,比如C语言的crc32(),先对前10字节进行CRC运算,然后把结果存储到`tx_buf`的最后两位。 以下是简化版的伪代码示例: ```cpp void sendReadRegisterRequest(uint8_t *tx_buf) { tx_buf[0] = 0x03; // Function code for Read Holding Registers (0x03) tx_buf[1] = 0x00; // Function code low byte tx_buf[2] = 0x00; // Start address (register 0x0000) tx_buf[3] = 0x00; tx_buf[4] = 0x01; // Data length (1 byte) uint16_t crc = calc_crc(tx_buf, 6); // Calculate CRC for first 6 bytes tx_buf[5] = crc & 0xFF; // Store lower byte of CRC tx_buf[6] = (crc >> 8) & 0xFF; // Store upper byte of CRC } // Function to calculate CRC using a library function (e.g., std::crc32()) uint16_t calc_crc(uint8_t *data, int len) { // Implement CRC calculation using library functions } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巨龙之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值