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

时间:2012-03-15 20:15:05

标签: c memory

我一直认为:

  1. char由字节
  2. 表示
  3. 一个字节总是可以指望有8位,
  4. sizeof (char)始终为1
  5. 并且我可以分配的最大理论内存量(在char s中计算)是RAM的字节数(+交换空间)。
  6. 但是现在我已经阅读了Wikipedia entry on the byte我不再那么确定了。

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

7 个答案:

答案 0 :(得分:38)

  1. 是的,charbyte几乎相同。字节是可存储的最小内存量,因此C中的char也是如此。char的大小始终为1。

    从规范, 3.6字节部分:

      

    <强>字节

         

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

    部分 3.7.1字符

      

    <强>字符

         

    单字节字符
      &LT c取代;适合字节的位表示

  2. 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.4 sizeof运营商部分,第3段:

      

    应用于类型为 char unsigned char signed char 的操作数时,(或其合格版本)结果为1.

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

    以下是完整的规范部分 7.20.3.3 malloc函数

      

    <强>概要

         

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

         

    <强>描述

         

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

         

    <强>返回

         

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

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

答案 1 :(得分:9)

sizeof(char)始终为1个字节。但是,一个字节并不总是一个八位字节:Texas Instruments TI C55x例如是一个16位字节的DSP。

答案 2 :(得分:6)

sizeof(char)定义为始终为1。来自C99:

  

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

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

答案 3 :(得分:4)

具体地说,某些体系结构,特别是在DSP领域中,char:s大于8位。在实践中,他们为了速度而牺牲了记忆空间。

答案 4 :(得分:3)

  

传统上,一个字节不一定是8位,而只是一个小字节   记忆区域,通常适合存储一个字符。 C   Standard遵循此用法,因此malloc和sizeof使用的字节数   可以超过8位。 [脚注](标准不允许这样做   少一点。)

但sizeof(char)始终为1。

记住C FAQ是一项促进职业发展的举措。

答案 5 :(得分:2)

不幸的事情(或者可能是幸运的,取决于你如何看待事物)是一个字节通常被认为是(8位)的想法与C编程语言认为的字节不是同义词。看一下之前的一些答案,一个字节在C编程语言中有一个确切的定义,在定义中没有提到一个字节是8位。它只是提到一个字节是

  

&#34;一个可寻址的数据存储单元,足以容纳任何成员   执行环境的基本字符集。&#34;

所以回答你的问题,“char永远总是总是有8位”,答案是,并非总是如此,但最常见的是。如果您想要确切了解数据类型在系统上消耗的空间位数,可以使用以下代码行:

sizeof(type) * CHAR_BIT

其中,type是您的数据类型。例如,要找出char占用系统的位数,可以使用以下内容:

printf("The number of bits a 'char' has on my system: %zu\n", sizeof(char) * CHAR_BIT);

这取自GNU C Library Reference Manual,其中包含有关该主题的以下有启发性的解释:

  

C语言中没有可以为您提供数字的运算符   整数数据类型中的位。但是你可以从宏计算它   CHAR_BIT,在头文件limits.h中定义。 CHAR_BIT - 这是   在大多数系统中,char-8中的位数。值有类型   INT。您可以计算任何数据类型类型中的位数   这样:

    `sizeof (type) * CHAR_BIT` 
     

该表达式包括填充位以及值和符号位。

答案 6 :(得分:1)

在C中,char始终是一个字节,因此您的第一个和第三个假设是正确的。

一个字节总是8位,所以你的第二个假设并不总是成立。也就是说,当前存在的所有系统中有> 99.99%具有8位字符,因此许多代码隐含地假设8位字符并且在所有目标平台上运行良好。当然Windows和Mac机器总是使用8位字符,而AFAIK Linux也是如此(Linux已被移植到如此众多的平台上,我不是百分之百确定有人没有将Linux移植到9位字符的平台上有道理)。

可以分配的最大内存量是虚拟内存的大小,减去为操作系统保留的空间。