# 数据类型说明

数据类型是编程语言中非常重要的概念，其作用主要有以下几个方面：

* 内存分配：不同的数据类型在内存中需要分配不同的空间。例如，整数通常需要占用 4 个字节的内存空间，而浮点数可能需要 8 个字节或更多的空间。因此，正确的数据类型可以确保内存使用效率和程序性能。
* 数据处理：不同的数据类型可以支持不同的操作和运算。例如，整数可以进行加减乘除等算术运算，而字符串可以进行连接、分割等操作。正确的数据类型可以确保数据处理的正确性和有效性。
* 输入输出：不同的数据类型需要不同的输入输出方式。例如，整数可以通过标准输入输出进行读写，正确的数据类型可以确保程序能够正确地读写数据。
* 代码逻辑：不同的数据类型对应不同的含义和用途，因此在编写代码时需要选择正确的数据类型来反映代码逻辑和意图。例如，布尔型变量通常用于控制流程和逻辑判断，而整数和浮点数通常用于数学计算。

综上所述，正确选择和使用数据类型是编程中至关重要的一步，它直接关系到程序的正确性、性能和可维护性。<br>
下面是 neuron 的数据类型：

|数据类型|数据范围|占用字节|数据示例|
|----|----|----|----|
|INT8|-128～127|1|比如 100，就是[0x64]|
|UINT8|0～255|1|比如 100，就是[0x64]|
|INT16|-32,768~32,767|2|比如 100，就是[0x64][0x00]|
|UINT16|0~65,535|2|比如 100，就是[0x64][0x00]|
|INT32|-2,147,483,648~2,147,483,647|4|比如 100，就是[0x64][0x00][0x00][0x00]|
|UINT32|0~4,294,967,295|4|比如 100，就是[0x64][0x00][0x00][0x00]|
|INT64|-9,223,372,036,854,775,808~9,223,372,036,854,775,807|8|比如 100，就是[0x64][0x00][0x00][0x00][0x00][0x00][0x00][0x00]|
|UINT64|0~18,446,744,073,709,551,615|8|比如 100，就是[0x64][0x00][0x00][0x00][0x00][0x00][0x00][0x00]|
|FLOAT(real)|-3.40E+38~+3.40E+38|4|比如 100，就是[0x00][0x00][0xC8][0x42]|
|DOUBLE(long real)|-1.79E+308~+1.79E+308|8|比如 100，就是[0x00][0x00][0x00][0x00][0x00][0x00][0x59][0x40]|
|BIT|0/1|1 个位|0x11 的第 0 位，为 1|
|BOOL|True/False|1 个位|0x11 的第 0 位，为 True|
|WORD|0~65,535|2|比如 100，就是[0x64][0x00]|
|DWORD|0~4,294,967,295|4|比如 100，就是[0x64][0x00][0x00][0x00]|
|LWORD|0~18,446,744,073,709,551,615|8|比如 100，就是[0x64][0x00][0x00][0x00][0x00][0x00][0x00][0x00]|

:::tip
编写程序需要理解数据的本质。例如，int 数据类型下的数字 1065353216 的数据本质是“00 00 80 3F”，而 float 数据类型下的数字 1 的数据本质也是“00 00 80 3F”。然而，当面对数据“00 00 80 3F”时，我们无法确定其代表什么含义。可能会认为 1065353216 太大，显然不对，必然是 float 类型的 1。但这是主观的人为判断，程序并不知道。因此，在解析数据时，必须使用正确的数据类型进行解析，否则会产生乱码。换言之，对于数据来说，应当使用与其原本类型相同的类型进行解析。
:::

## 关于数据排列问题

上述的数据表格里有例子，int 数据 100 的本质是 "64 00 00 00"，而从我们的人的感官来说，应该是 "00 00 00 64" 比较合理。大部分人的习惯是高位在前，低位在后。但这只是一种规定，数据存储可以有多种排列，大体上分为三种：

* 小端排列：典型的代表是 C# 语言，三菱 PLC。
* 大端排列：典型的代表是西门子 PLC。
* 其他不规则：典型的代表是 modbus 设备。

neuron 支持多种字节顺序，如下表所示：

### ENDIAN

字节顺序，适用于 int16/uint16/int32/uint32/float 数据类型，详细说明见下表。
| 符号 | 字节顺序 | 支持的数据类型        | 备注 |
| --- | ------- | ------------------ | ----- |
| #B  | 2,1     | int16/uint16       |       |
| #L  | 1,2     | int16/uint16       | 默认字节顺序 |
| #LL | 1,2,3,4 | int32/uint32/float | 默认字节顺序 |
| #LB | 2,1,4,3 | int32/uint32/float | |
| #BB | 3,4,1,2 | int32/uint32/float | |
| #BL | 4,3,2,1 | int32/uint32/float | |

### .LEN\[H]\[L]\[D]\[E]

当数据类型为 STRING 类型时，**.LEN** 是必填项，表示字符串需要占用的字节长度，每个寄存器中包含**H**，**L**，**D** 和**E** 四种存储方式，如下列表格所示。
| 符号 | 说明                                  |
| --- | ------------------------------------- |
| H   | 一个寄存器存储两个字节，高字节在前低字节在后。 |
| L   | 一个寄存器存储两个字节，低字节在前高字节在后。 |
| D   | 一个寄存器存储一个字节，且存储在低字节。      |
| E   | 一个寄存器存储一个字节，且存储在高字节。      |
