C 中的位、字节、字符和整数大小

Bits, bytes, character, and integer sizes in C

根据我在 Whosebug 上搜索和发现的内容,我发现一个字符始终为 1 个字节。这是肯定的。但是,我也看到它可能不是 8 位(可能更大,请参阅 CHAR_BITS)。这是否意味着如果它是 10 位,在某些假设的体系结构中,那么 1 字节 = 10 位?这是否意味着如果实现将整数默认为 4 个字节,那么 int 的大小将是 40 位?尽管 Internet 上的线程数量惊人,但我对所有这些位字节的变化有点不满意。

对于现代平台,这些大小是可以预测的,byte 是八位,int 是四或八个字节,等等。 "bytes" 的定义和实现不太可能改变,因为它的这个版本结合了 1970 年代 8 位 CPU 的引入,这可以说导致 ASCII 战胜了竞争标准。它已经变得如此根深蒂固,以至于一些语言按字面意思对待它:在法语中,"byte" 的单词是 "octet".

对于历史平台,一切皆有可能。有些使用 10、12、18 或 36 位整数。早期的计算机根本不使用字节,而是使用任意大小的 words。事物由这些单元组成,其中 "double word" 值无论出于何种原因都可能是 48 位。这是来自一个时代,一个比特可能由几个真空管或全尺寸晶体管表示,因此实际成本问题导致一些非常不寻常的设计。

现在说到字符,它们不一定是一个字节。在 UNICODE 中,它们可以远不止于此,尤其是当表示为 UTF-8、UTF-16 或 UTF-32 时,这种文本的常用编码方法。只有在像 Latin1 这样的 8 位编码中,字符和字节是可以互换的。

重要的是要考虑到,虽然大多数消费类 CPU 的大小都非常相似,但在处理 DSP 或定制 FPGA 处理器等专用设备时,这一切都超出了 window。

好消息是,您不太可能在围绕异常寄存器大小构建的 DSP 或自定义 FPGA 处理器上进行字符处理。这些通常专注于处理其他类型的数字数据。