用来表示ANSI(C89 / 90)C中的一个字节的types?
ANSI(C89 / 90)C中是否有标准投诉方法来表示字节? 我知道,通常情况下,字符恰好是一个字节,但我的理解是,这并不能保证是这样的。 另外,在C99标准中有stdint.h,但在C99之前使用了什么?
我对8位特别感兴趣,还有一个“字节”(sizeof(x)== 1)。
char
总是一个字节 ,但并不总是一个八位字节 。 一个字节是内存中最小的可寻址单元(在大多数定义中),一个八位字节是8位内存单元。
也就是说,对于所有实现, sizeof(char)
总是1 ,但limits.h
CHAR_BIT
macros定义了平台的字节大小,并不总是8位。 有16位和32位字节的平台,因此char
将占用更多的位,但它仍然是一个字节。 由于char
所需范围至less为-127至127(或0至255),因此在所有平台上至less为 8位。
ISO / IEC 9899:TC3
6.5.3.4运算符sizeof
- …
- sizeof运算符产生其操作数的大小( 以字节为单位 ),该操作数可能是一个expression式或一个types的括号内的名称。 […]
- 当应用于具有
char
,unsigned char
或signed char
的操作数(或其合格版本)时,结果为1 。 […]
强调我的。
你可以总是用一个无符号的字符表示一个字节(如果你的意思是8位)。 它总是至less有8位的大小,所有的位组成的值,所以一个8位的值将永远适合它。
如果你想正好8位,我也认为你将不得不使用平台依赖的方式。 似乎需要 POSIX系统来支持int8_t。 这意味着在POSIX系统上,char(因此一个字节)总是8位。
在ANSI C89 / ISO C90 sizeof(char)== 1中。然而,1字节不是总是8位。 如果你想计算1个字节的位数(并且你没有访问limits.h),我build议如下:
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 ”。
在C99之前? 平台相关的代码。
但你为什么在乎呢? 只需使用stdint.h。
在CI的每个实现中都使用了(从旧的UNIX到由硬件工程师编写的大型编译器编写的embedded式编译器) char
始终是8位的。
你可以在boost中find非常可靠的macros和typedefs。
我注意到有些答案已经将字节重新定义为8位以外的意思。 一个字节是8位,但是在一些c实现中,char是16位(2字节)或8位(1字节)。 调用字节“最小可寻址内存单元”或某些这样的垃圾的人已经失去了对字节(8位)含义的掌握。 C的一些实现有16位字符(2字节),有些字符有8位字符(1字节),而没有标准types称为“字节”的原因是由于懒惰。
所以,我们应该使用int_8