首页 文章

有机器,sizeof(char)!= 1,或者至少CHAR_BIT> 8?

提问于
浏览
88

是否有机器(或编译器), sizeof(char) != 1

C99 standard 是否认为标准合规实施的 sizeof(char) 必须正好为1?如果有,请给我部分编号和引文 .

更新:如果我有一台机器(CPU),它不能解决字节(最小读取是4个字节,对齐),但只有4-s的字节( uint32_t ),这台机器的编译器可以将sizeof(char)定义为4 ? sizeof(char) 将为1,但char将具有32位( CHAR_BIT 宏)

Update2:但是sizeof结果不是BYTES!这是CHAR的大小 . char可以是2个字节,或者(可能是)7位?

Update3:好的 . 所有机器都有 sizeof(char) == 1 . 但是什么机器 CHAR_BIT > 8

3 回答

  • 8

    它始终是C99第6.5.3.4节中的一个:

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

    编辑:不是你的问题的一部分,而是来自Harbison和Steele,第3版的兴趣 . (前c99)p . 148:

    存储单元被视为一个字符占用的存储量;因此,char类型的对象的大小为1 .

    编辑:在回答您更新的问题时,Harbison和Steele的以下问答是相关的(同上,第6章第4节):

    是否允许使用C实现,其中char类型可以表示从-2,147,483,648到2,147,483,647的值?如果是这样,那个实现下的sizeof(char)会是什么? int类型的最小和最大范围是什么?

    答案(同上,第382页):

    允许(如果浪费)实现使用32位来表示char类型 . 无论实现如何,sizeof(char)的值始终为1 .

    虽然这并没有专门解决这样一种情况:比如字节是8位而 char 是这些字节中的4个(实际上不可能用c99定义,见下文), sizeof(char) = 1 总是从c99标准和Harbison和Steele中清楚 .

    编辑:事实上(这是对你的upd 2问题的回应),就c99而言, sizeof(char) 是以字节为单位,再次来自6.5.3.4节:

    sizeof运算符产生其操作数的大小(以字节为单位)

    因此结合上面的引用,8位字节和 char 作为这些字节中的4个是不可能的:对于c99,一个字节与 char 相同 .

    在回答你提到7位 char 的可能性时:这在c99中是不可能的 . 根据该标准的5.2.4.2.1节,最小值为8:

    它们的实现定义值应与所示的值相等或更大[我的强调],具有相同的符号 .

    • 不是位字段(字节)的最小对象的位数
    **CHAR_BIT 8**
    
    • signed char类型对象的最小值
    **SCHAR_MIN -127//−(27−1)**
    
    • signed char类型的对象的最大值
    **SCHAR_MAX +127//27−1**
    
    • unsigned char类型对象的最大值
    **UCHAR_MAX 255//28−1**
    
    • char类型对象的最小值
    **CHAR_MIN**    see below
    
    • char类型对象的最大值
    **CHAR_MAX**    see below
    

    [...]

    如果在表达式中使用char类型的对象的值被视为有符号整数,则CHAR_MIN的值应与SCHAR_MIN的值相同,并且CHAR_MAX的值应与SCHAR_MAX的值相同 . 否则,CHAR_MIN的值应为0,CHAR_MAX的值应与UCHAR_MAX的值相同 . 值UCHAR_MAX应等于2 ^ CHAR_BIT - 1 .

  • 87

    没有 sizeof(char) 为4的机器 . 它是's always 1 byte. That byte might contain 32 bits, but as far as the C compiler is concerned, it'的一个字节 . 有关详细信息,我实际上会指向您C++ FAQ 26.6 . 该链接很好地涵盖了它,我相当肯定C从C获得了所有这些规则 . 对于大于8位的字符,您也可以查看comp.lang.c FAQ 8.10 .

    Upd2:但是结果的大小不是BYTES!这是CHAR的大小 . char可以是2个字节,或者(可能是)7位?

    是的,它是字节 . 让我再说一遍 . 根据C编译器, sizeof(char) 是1个字节 . 人们通俗地称之为字节(8位)的内容不一定与C编译器调用字节的内容相同 . C字节中的位数因机器架构而异 . 它也保证至少8 .

  • 16

    PDP-10和PDP-11是 .

    更新:没有像PDP-10那样的C99编译器 .

    某些型号的ADI公司32位SHARC DSP的CHAR_BIT = 32,而TMS32F28xx的德州仪器DSP的CHAR_BIT = 16,reportedly .

    更新:11701374,CHAR_BIT = 9(在该存档中检查include / limits.h) .

相关问题