1字节不是一定是8位。

结论写在前面

sizeof返回的是以字节(byte)为单位的大小,char的大小永远都是1字节。

字节通常情况下为8位,但是不是必然,也可能是别的大小,比如TI的28x系列DSP里 一个字节的大小为16位。

事情经给

前段时间,发现一个没见过的事情,TI的28x系列DSP中,一个char占据的空间是16位的,但是sizeof(char)的返回值是1。

一开始没注意,后来在程序里读文件,发现读到的值和预期的效果有差异,调试看内存发现从文件读进的一个连续的char的数组,竟然是16位16位占空间的。给char的变量赋值0xFFFF也可以正常的赋值,内存里显示的变量内容就是0xFFFF。于是我认为这个char大小就是16位。

就把这个现象微信群里和朋友说了下,朋友死活不信,认为char就是八位。只不过编译器为了运算效率,内存存储优化成了16字节。哪怕内存监视的时候显示是16位,但用的时候只能按照8位用。

双方僵持不下,当时DSP这块板子也不在身边,没办法talk is less, show me the code。

于是开始翻C89的规范。

里面很明确的提到了sizeof返回的是以byte为单位的大小,而且sizeof(char)的返回值必然为1,也就是1byte。

当时我的认知一直认为一个byte就是8位,所以感觉,这里的c标准在自相矛盾,怀疑是这句子里存在着我不懂的语法,导致我的理解问题有问题(后来证明我想太多)。

后来接着搜各种关键词,搜到了一份28x系列的编译器用户指南,

Note这一段讲的非常清楚。这个系列的Byte大小是16位的。又去搜了下Byte这个词条,发现Wiki上也没有说Byte一定是八位的。

所以问题解决,结论见上。

### 机器字长与字节的关系 在计算机体系结构中,机器字长确实通常是字节的整数倍。这一特性源于硬件设计的需求以及为了提高数据处理效率。 #### 字长的选择依据 选择字长为字节的整数倍有几个主要原因: - **简化硬件设计**:当字长设定为字节的整数倍时,能够使处理器内部的数据路径更加规整,减少逻辑电路复杂度[^1]。 - **提升内存访问效率**:现代计算机系统中的RAM是以字节编址的方式组织起来的;如果字长不是字节的整数倍,则会增加地址计算难度并可能导致额外开销。因此让两者成比例有助于更高效地读取/写入连续块状数据[^2]。 - **增强兼容性和标准化程度**:大多数编程语言和操作系统都基于8作为基本单来操作数据(即一字节),所以保持一致有利于软件层面的一致性及跨平台移植性[^3]。 综上所述,在实际工程实践中几乎所有的商用微处理器都会采用这种方式来进行架构规划——即使某些特殊应用场景下存在例外情况也极为罕见。 ```cpp // 示例代码展示如何根据不同的字长进行数据处理 #include <iostream> void processData(int wordLengthInBits, unsigned char* data) { int bytesPerWord = (wordLengthInBits + 7) / 8; // 向上取整到最接近的字节数 std::cout << "Processing with a word length of " << wordLengthInBits << " bits (" << bytesPerWord << " byte(s))..." << std::endl; } int main() { unsigned char testData[] = {0x12, 0x34, 0x56}; processData(8 * sizeof(testData), testData); // 使用整个数组作为一个单词处理 processData(16, testData); // 将前两个元素视为单个16词 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值