为什么在内核编程中使用 u8 u16 u32 u64 而不是 unsigned int
why is u8 u16 u32 u64 used instead of unsigned int in kernel programming
我看到内核代码中使用了 u8 u16 u32 u64 数据类型。我想知道为什么需要使用 u8
或 u16
或 u32
或 u64
而不是 unsigned int
?
通常在靠近硬件工作或试图控制数据结构的 size/format 时,您需要精确控制整数的大小。
至于 u8
与 uint8_t
,这仅仅是因为 Linux 早于 <stdint.h>
在 C 中可用,这在技术上是 C99 主义,但在我的即使在其 ANSI-C / C89 模式下,大多数现代编译器都可以获得经验。
将我的 10 美分加到 :
u64
表示 'unsigned 64 bits' 值,因此,根据代码将 run/be 编译的体系结构,必须对其进行不同的定义才能真正达到 64 位长。
例如,在 x86 机器上,unsigned long
是 64 位长,因此该机器的 u64
可以定义如下:
typedef unsigned long u64;
u32
也是如此。在 x86 机器上,unsigned int
是 32 位长,因此该机器的 u32
可以定义如下:
typedef unsigned int u32;
您通常会在 types.h
文件中找到这些类型的 typedef
声明,该文件对应于您将源代码编译到的架构。
我看到内核代码中使用了 u8 u16 u32 u64 数据类型。我想知道为什么需要使用 u8
或 u16
或 u32
或 u64
而不是 unsigned int
?
通常在靠近硬件工作或试图控制数据结构的 size/format 时,您需要精确控制整数的大小。
至于 u8
与 uint8_t
,这仅仅是因为 Linux 早于 <stdint.h>
在 C 中可用,这在技术上是 C99 主义,但在我的即使在其 ANSI-C / C89 模式下,大多数现代编译器都可以获得经验。
将我的 10 美分加到
u64
表示 'unsigned 64 bits' 值,因此,根据代码将 run/be 编译的体系结构,必须对其进行不同的定义才能真正达到 64 位长。
例如,在 x86 机器上,unsigned long
是 64 位长,因此该机器的 u64
可以定义如下:
typedef unsigned long u64;
u32
也是如此。在 x86 机器上,unsigned int
是 32 位长,因此该机器的 u32
可以定义如下:
typedef unsigned int u32;
您通常会在 types.h
文件中找到这些类型的 typedef
声明,该文件对应于您将源代码编译到的架构。