为什么在内核编程中使用u8 u32 u64 u64而不是unsigned int

15 c linux kernel linux-device-driver

我看到内核代码中使用的u8 u16 u64 u64数据类型.我想知道为什么会出现需要使用u8u16u32u64unsigned int

Bri*_*and 19

通常,当您在硬件附近工作或尝试控制数据结构的大小/格式时,您需要精确控制整数的大小.

至于u8vs uint8_t,这仅仅是因为Linux早<stdint.h>于C语言可用,这在技术上是C99主义,但根据我的经验,大多数现代编译器都可以使用它们的ANSI-C/C89模式.

  • 真的......但是当你需要混合和匹配库并且每个人都试图定义他们自己的已知的wdith类型时,它会变得非常烦人.你将在同一个文件中拥有`U8`,`u8`,`uint8`,`BYTE`,`UINT8`和`unt8_t`.您甚至可能会遇到潜在的冲突,最终会产生警告.最常见的是32位和64位类型,它们可能有多种有效的方法来在给定平台上键入它们.对于新代码,请,请坚持使用stdint.h类型:). (10认同)
  • 而'u8`涉及的打字较少:-) (5认同)
  • 您也可以在内核模式下使用标准名称(`uint8_t`等).这些类型的typedef也在`linux/types.h`中. (2认同)
  • @BrianMcFarland只要你的'u8`等你自己的*typedef,你可以保证与标准的相同,你会没事的.正如吉尔汉密尔顿所说,[内核这样做](http://lxr.free-electrons.com/source/include/linux/types.h) (2认同)

Chr*_*Bao 8

分享一下我最近了解到的这个问题。

我们需要这种明确大小的类型(例如 u32)的原因是普通 C 数据类型在所有体系结构上的大小并不相同。

下图显示了长整数和指针在不同平台上具有不同的大小。

在此输入图像描述

这样,u32就可以保证你得到4个字节长的整数。


Ale*_*idt 6

将我的 10 美分加到这个答案中

u64 表示“无符号 64 位”值,因此,根据代码将运行/编译的体系结构,必须对其进行不同定义才能真正达到 64 位长。

例如,在 x86 机器上, anunsigned long是 64 位长,因此u64对于该机器可以定义如下:

typedef unsigned long u64;

这同样适用于u32。在 x86 机器上,unsigned int长度为 32 位,因此u32对于该机器可以定义如下:

typedef unsigned int u32;

您通常会typedeftypes.h文件中找到这些类型的声明,该文件与您将源代码编译到的体系结构相对应。