GLib类型的位大小和可移植性更奇特(想想16位char)的平台
Bit size of GLib types and portability to more exotic (think 16 bit char) platforms
例如,给定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
可以是不同的。
- 将浮动的heightmap数组导出为16位原始值
- 宽度为奇数的16位纹理为片状
- OpenGL 16 位模板缓冲区?
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 16 位到 10 位转换代码说明
- AVX2 整数乘以有符号 8 位元素,产生有符号 16 位结果?
- C++将 16 位值转换为 32 位值
- 24 位地址和 24 位算术与 24 位地址与 16 位地址算术之间的区别?
- 16 位系统中的程序如何访问大于 65535 的整数,但不能访问地址
- 将 Uint8(浮点AUDIO_F32)转换为int16_t(16 位 PCM)
- AVX2 SIMD Instrinsics 16 位到 8 位,反之亦然
- 如何打开和读取16位.raw文件Vc++(Wince 平台)
- MongoDB C++ 驱动程序 - 8 位和 16 位整数?
- 使用 OpenCV 和 C++将 16 位灰度图像更改为彩色图像
- 对 32 位整数进行哈希处理比对 3 个 16 位整数的哈希进行按位运算慢?
- OpenCV 实感 16 位深度图像
- 有没有办法让32位C 编译器遵循16位整数促销规则
- 如何将 16 位无符号 int 转换为 8 位无符号字符并最终返回无符号字符*?
- 为什么16位编译器会给未知的char []声明提供错误
- GLib类型的位大小和可移植性更奇特(想想16位char)的平台