`char`总是总是有8位吗?

lin*_*lof 41 c memory

我一直认为:

  1. a char由一个字节表示,
  2. 一个字节总是可以指望有8位,
  3. sizeof (char)总是1,
  4. 并且我可以分配的最大理论内存量(以chars 计)是RAM的字节数(+交换空间).

但是现在我已经阅读了维基百科条目,我不再那么肯定了.

我的假设中有哪一个是错的?哪一个是危险的?

Car*_*rum 43

  1. 是的,char而且byte是几乎一样的.一个字节是最小的可寻址内存量,因此char在C.中,a char始终具有大小为1.

    从规范,第3.6字节:

    字节

    可寻址的数据存储单元,其大小足以容纳执行环境的基本字符集的任何成员

    3.7.1部分字符:

    字符


    适合字节的单字节字符<C>位表示

  2. A charCHAR_BIT位.它可以是任何数字(根据规范,8或更高),但绝对是最常见的8.但是有真正的机器有16位和32位char类型. CHAR_BIT定义于limits.h.

    从规范,第5.2.4.2.1<limits.h>整数类型的大小:

    下面给出的值应替换为适用于#if预处理指令的常量表达式.此外,除了CHAR_BIT和之外MB_LEN_MAX,以下内容应由与表达式相同的表达式替换,该表达式是根据整数提升转换的相应类型的对象.它们的实现定义值的大小(绝对值)应等于或大于显示的值,并带有相同的符号.

    - 不是位字段(字节)的最小对象的位数
        CHAR_BIT                               8

  3. sizeof(char) == 1.总是.

    根据规范,第6.5.3.4sizeof,运营人,第3段:

    当应用于具有类型的操作数char,unsigned charsigned char,(或合格的版本物)的结果是1.

  4. 您可以分配尽可能多的内存,系统将允许您分配 - 标准中没有任何内容可以定义可能的内容.例如,您可以想象一台具有云存储支持的内存分配系统的计算机 - 您的可分配内存可能实际上是无限的.

    这是完整的规格部分7.20.3.3 malloc功能:

    概要

    1 #include <stdlib.h>
       void *malloc(size_t size);

    描述

    2该malloc函数为大小由其指定size且其值不确定的对象分配空间.

    返回

    3该malloc函数返回空指针或指向已分配空间的指针.

    这就是规范的全部内容,因此您无法依赖任何限制.

  • 具体地说,在Linux上存储器过量使用时,完全可以在具有8G mem + swap的盒子上分配2TB的内存. (2认同)

Mic*_*kis 9

sizeof(char)总是1个字节.但是,一个字节并不总是一个八位字节:例如,德州仪器TI C55x是一个具有16位字节的DSP.

  • 有很多真正的机器具有非8位字节. (2认同)

Ed *_* S. 6

sizeof(char)被定义为永远1.来自C99:

当应用于具有char,unsigned char或signed char(或其限定版本)类型的操作数时,结果为1.

但是,它不能保证为8位.在实践中,在绝大多数平台上,它将是,但不是,你不能在技术上指望始终如此(也不应该重要,因为你应该使用sizeof无论如何).


Lin*_*cer 6

具体来说,某些架构,特别是在 DSP 领域,其字符长度大于 8 位。在实践中,他们牺牲内存空间来换取速度。

  • 鉴于我在一家提供此类编译器的公司工作,我发现投反对票相当令人费解......请解释一下! (3认同)