u8,uint8_t,__ u8和__be8之间的区别

时间:2014-11-12 03:58:25

标签: c linux linux-kernel

在浏览linux网络代码时,我遇到了以下数据类型:

  
      
  1. U8
  2.   
  3. uint8_t
  4.   
  5. __ U8
  6.   
  7. __ BE8
  8.   

(16,32和64位的相同内容)

有人可以解释这些数据类型和使用位置之间的区别吗? 我已经看到了这些数据类型的定义,但那些对我来说并不清楚。

3 个答案:

答案 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]

相关问题