GLib类型的位大小和可移植性更奇特(想想16位char)的平台

Bit size of GLib types and portability to more exotic (think 16 bit char) platforms

本文关键字:想想 16位 char 平台 类型 可移植性 GLib      更新时间:2023-10-16

例如,给定https://developer.gnome.org/glib/stable/glib-Basic-Types.html:

的定义

gint8

typedef signed char gint8;

在所有平台上保证为8位的有符号整数。的值此类型的取值范围为G_MININT8(= -128)到G_MAXINT8 (= 127)

—在char不是8位的平台上,GLIb如何保证类型仍然是8位的?还是GLib仅限x86/等(即这是已知的限制吗)?

正如Hans Passant在他的评论中所说,glib通过不支持signed char为任何其他大小的平台来保证gint8是8位的。只有两种系统的C编译器实现不满足这个要求。

第一种是字节大小为9位的系统。今天这些早就过时了,但是像这样的系统有一些最早的C编译器。理论上,编译器可以模拟受限范围的8位类型作为扩展,但它在内存中仍然是9位长,并且不能真正得到任何东西。

第二种是字可寻址系统,字长为16位、32位或64位。在这些计算机中,处理器只能在字边界处寻址内存。地址0是第一个单词,地址1是第二个单词,以此类推,单词之间没有任何重叠。在大多数情况下,像这样的系统现在已经过时了,但在任何地方都不会像9位字节机器那样过时。显然,在嵌入式系统中,至少还有一些字可寻址处理器的使用。

在针对字可寻址系统的C编译器中,字节的大小取决于编译器,是字长还是8位。一些编译器给出了一个选择。使用字大小的字节是最简单的方法。另一方面,实现8位字节需要相当多的工作。编译器不仅必须使用多个指令来访问每个单词中包含的单独的8位值,而且还必须模拟字节可寻址指针。这通常意味着char指针的大小与int指针不同,因为字节可寻址指针需要更多的空间来存储地址和字节偏移量。

不用说,使用字大小字节的编译器不支持glib,而使用8位字节的编译器至少可以实现gint8。尽管由于其他一些原因,它们可能仍然不会得到支持。sizeof(char *) > size(int *)为真这一事实可能是个问题。

我还应该指出,还有一些其他过时的系统,虽然有使用8位字节的C编译器,但仍然没有满足gint8要求的类型。这些系统使用1的补码或有符号大小整数,这意味着signed char的范围从-127到127,而不是glib保证的-128到127。

gint8(以及其他平台依赖类型)在glibconfig.h中声明,通常安装在/usr/lib/glib-2.0/include下。

该文件是在配置时生成的,因此,至少在理论上,gint8可以是不同的。