用于表示ANSI(C89 / 90)C中的字节的类型?

ANSI(C89 / 90)C中是否有标准投诉方法来表示字节? 我知道,大多数情况下,字符恰好是一个字节,但我的理解是,这不能保证是这种情况。 另外,在C99标准中有stdint.h,但在C99之前使用了什么?

我对8位特别感兴趣,还有一个“字节”(sizeof(x)== 1)。


char始终是一个字节 ,但它并不总是一个八位字节 。 一个字节是最小的可寻址内存单元(在大多数定义中),一个八位字节是8位内存单元。

也就是说,对于所有实现, sizeof(char)总是1 ,但limits.h CHAR_BIT宏定义了平台的字节大小,并不总是8位。 有16位和32位字节的平台,因此char将占用更多的位,但它仍然是一个字节。 由于char所需范围至少为-127至127(或0至255),所以在所有平台上都至少为8位。

ISO / IEC 9899:TC3

6.5.3.4运算符sizeof

  • ...
  • sizeof运算符产生其操作数的大小( 以字节单位 ),该操作数可以是表达式或类型的括号内的名称。 [...]
  • 当应用于具有char类型, unsigned charsigned char (或其合格版本)的操作数时,结果为1 。 [...]
  • 强调我的。


    您始终可以用无符号字符表示一个字节(如果您的意思是8位)。 它总是至少有8位的大小,所有的位都构成了这个值,所以一个8位的值将永远适合它。

    如果你想正好8位,我也认为你必须使用平台依赖的方式。 似乎需要POSIX系统来支持int8_t。 这意味着在POSIX系统上,char(因此一个字节)总是8位。


    在ANSI C89 / ISO C90 sizeof(char)== 1中。然而,并非总是如此,1字节是8位。 如果你想计算1个字节的位数(并且你没有访问limits.h),我建议如下:

    unsigned int bitnum(void) {
        unsigned char c = ~0u; /* Thank you Jonathan. */
        unsigned int v;
    
        for(v = 0u; c; ++v)
            c &= c - 1u;
        return(v);
    }
    

    这里我们使用Kernighan的方法来计算在c中设置的位数。 为了更好地理解上面的代码(或者看看其他人喜欢它),我把你称为“Bit Twiddling Hacks”。

    链接地址: http://www.djcxy.com/p/6895.html

    上一篇: Type to use to represent a byte in ANSI (C89/90) C?

    下一篇: What is the difference between an int and a long in C++?