每隔一段时间,就有人指出char (aka 'byte') isn't necessarily 8 bits个.

看起来8位char几乎是通用的.我本以为,对于主流平台,有必要使用8位char,以确保其在市场上的生存能力.

无论是现在还是过go ,哪些平台使用的char不是8位,为什么它们与"正常"的8位不同?

在编写代码和考虑跨平台支持时(例如,对于通用库),对于使用非8位char的平台,有什么值得考虑的?

在过go ,我遇到过一些模拟设备DSP,其char为16位.我想DSP是一种小众架构.(再说一次,当时手工编写的汇编程序很容易击败现有的C编译器,所以我在该平台上没有太多C语言的经验.)

推荐答案

在例如OMAP2中出现的德州仪器C54x DSP上,char也是16位.还有其他16位和32位char的DSP.我想我甚至听说过24位DSP,但我不记得是什么了,所以可能是我想象出来的.

另一个考虑因素是POSIX要求CHAR_BIT == 8.因此,如果您使用的是POSIX,您可以假设它.如果后来有人需要将您的代码移植到接近POSIX的实现中,那正好有您使用的函数,但大小不同,这是他们的厄运.

不过,总的来说,我认为绕过这个问题几乎总是比考虑它容易.只需输入CHAR_BIT即可.如果您想要精确的8位类型,请使用int8_t.您的代码将无法在没有提供实现的实现上进行编译,而不是静默地使用您没有预料到的大小.至少,如果我遇到了一个我有很好的理由假设它的 case ,那么我会断言它.

C++相关问答推荐

C:gcc返回多个错误定义,但msvc—不""'

无效使用未定义类型'structsquare'?

在C中使用强制转换将uint16_t转换为uint8_t [2]是否有效?

在C中使用JMP_buf数组进行线程化(在xv6中测试)

C:scanf(%d&q;,...)输入只有一个减号

堆栈帧和值指针

识别和处理c中整数溢出的最佳方法?

X86/x64上的SIGSEGV,由于原始内存访问和C中的DS寄存器之间的冲突,在Linux上用TCC编译为JIT引擎

_泛型控制表达式涉及数组碰撞警告的L值转换错误?

X64:并发写入布尔数组

为什么中断函数会以这种方式影响数组?

如何用c语言修改shadow文件hash部分(编程)?

为什么数组的最后一个元素丢失了?

C中的回文数字

unions 的原子成员是个好主意吗?

计算时出现奇怪的计算错误;N Select K;在C中

GnuCobol 使用 double 类型的参数调用 C 函数

System V 消息队列由于某种原因定期重置

为什么写入关闭管道会返回成功

C 中 struct 体自赋值是否安全?特别是如果一侧是指向 struct 的指针?