在浏览linux网络代码时,我遇到了以下数据类型:
- U8
- uint8_t
- __ U8
- __ BE8
醇>
(16,32和64位的相同内容)
有人可以解释这些数据类型和使用位置之间的区别吗? 我已经看到了这些数据类型的定义,但那些对我来说并不清楚。
答案 0 :(得分:10)
uint8_t
是标准C,表示无符号8位整数类型。如果您所在的系统没有8位可寻址单元,那么这将不会被定义;否则typedef
可能是unsigned char
。
其中包含__
的任何内容都保留供实施使用。这意味着编译器编写者和标准库编写者可以使用这些标识符,而无需担心与用户代码的名称冲突。在查看标准库实现的内部时,您可能会看到这一点。
u8
是非标准的,但几乎可以肯定与uint8_t
相同。可能使用u8
的原因是在uint8_t
添加到标准C之前编写的代码中。
答案 1 :(得分:1)
最后一个表示big-endian(对于单个字节不重要),也就是网络字节顺序。
其他的都是相同的,一个8位/ 1字节的无符号类型。
以上都适用于那些具有16位/ 2字节resp的类型。 32位/ 4字节。
(x86上的主机字节顺序例如是little-endian,Linux只能在8位字节机器上运行。)
在列表中只有uint8_t
由C标准定义(在<stdint.h
中),后两个在实现名称空间中,这通常是个坏主意。
答案 2 :(得分:0)
@Soumen
“对不起,我忘了提到u_int8_t。这有什么用?”
uint8_t
适用于Windows,u_int8_t
适用于Linux。
对于Windows,在使用uint8_t
时,必须使用头文件<stdint.h>
。
如果要将代码从linux带到Windows环境,则最好更改为uint8_t
格式。
来源:[https://www.binarytides.com/data-type-u_int8_t-u_int16_t-u_int32_t-on-windows/][1]