最初的MIX架构具有6位字节,存储器被寻址为31位字(5个字节和一个符号位).作为一个思考练习,我想知道C语言如何在这种环境中发挥作用,给出:
- char至少有8位(C99规范附件E)
- C99规范6.3.2.3节("指针")第8段说"当指向对象的指针转换为指向字符类型的指针时,结果指向对象的最低寻址字节.结果连续增加,向上到对象的大小,产生指向对象剩余字节的指针." 我对这个要求的解释是它支持"memcpy(&dst_obj,&src_obj,sizeof(src_obj))".
我能想到的方法:
- 使char为31位,因此通过"char*"间接是简单的内存访问.但这会使字符串浪费(并且意味着它不符合POSIX标准,因为它显然需要8位字符)
- 将3个8位字符打包成一个字,7个忽略位:"char*"可能由字地址和字符索引组成.然而,这似乎违反了6.3.2.3,即memcpy()必然会跳过忽略的位(这对于真实对象类型可能有意义)
- 将字符完全打包成单词,例如第四个8位字符在字0中有7位,在字1中有一位.但是这似乎要求所有对象都是8位字符大小,例如"uint31_t"不能声明匹配单词长度,因为这又有memcpy()问题.
所以这似乎留下了使用31位字符的第一个(浪费)选项,所有对象的大小都是char的倍数 - 我是否正确地阅读它?