我正在尝试为一台非常奇怪的机器创建(tinyc 的新后端)ac 编译器。它唯一的可寻址单元是 16 位字,即它不能在 8 位字节级别寻址。它的自然 int 大小也是 16。

据我所知,c 标准规定 char 必须至少为 8 位,short 必须至少为 16 位。但是没有任何内容表明 sizeof(char) 不能 = sizeof(short)。

甚至想到这样的系统都感觉很奇怪,我们对 ram 中的字符和短裤等都有如此强烈的心理模型。

我的替代方案是采用“正常”数据类型,并通过获取单词并将其切碎来模拟 8 位行为。我的问题是,没有移位或旋转指令,因此这样做会非常昂贵(即使模拟右移一位,以便对一个字节进行字提取,也需要至少 32 个指令,测试并设置每个位,或向左长旋转)。感觉我的 100mhz fpga 将以 2mhz 运行

12

  • 1
    。有些甚至有


    – 

  • 如果sizeof(char) == sizeof(int),那么我看不到任何合理的方法来实现该函数,因为该函数的返回值将无法表示整个unsigned char值范围,或者至少无法以这些值与 value 区分开来的方式EOF


    – 


  • @AndreasWenzel:这已经在 Stack Overflow 上讨论过了。我记得,无法区分EOF是一件麻烦事,但并非无法克服。


    – 

  • 1
    @AndreasWenzel:


    – 

  • 1
    sizeof(int) == 1如果考虑到平台的可移植性,那么fgetc可以将调用替换为fread.


    – 


2 个回答
2

char 是 16 位、short 也是 16 位的 ac 环境是否合法

是的。

2

  • 但你不会兼容 posix,所以这意味着我无法使用大量现有的 C 代码库。我希望编译一个旧的unix


    – 

  • 我喜欢简短的回答,而且我不能撒谎。拿起你的勾


    – 


charC 对和的宽度的唯一要求shortchar必须至少为 8 位并且short必须至少为 16 位,并且至少与 一样大char,因为char必须是最小的可寻址类型。所以是的,这是合法的。

我的引用是

它们的实现定义的值应等于或大于所示的值(绝对值),并具有相同的符号。

非位字段的最小对象的位数(字节)

CHAR_BIT 8

类型对象的最大值unsigned short int

USHRT_MAX 65535 // 2^16 − 1

10

  • 1
    还相关: §6.3.1.1定义转换等级的。值得注意的是: —任何两个有符号整数类型都不应具有相同的秩,即使它们具有相同的表示形式。 — 有符号整数类型的等级应大于任何精度较低的有符号整数类型的等级。 — long long int 的等级应大于 long int 的等级,long int 的等级应大于 int 的等级,int 的等级应大于 Short int 的等级,short int 的等级应大于signed char 的等级。


    – 


  • 1
    @ikegami 不,C99 也有这样的要求CHAR_BIT >= 8


    – 

  • 真正的问题是“有多少软件假设 char 是 8 位,short 是 2 字节”。创建 ac 编译器的原因是为了能够使用现有软件的庞大库。我敢打赌一吨会碎。


    – 


  • 1
    @pm100 执行“不安全”操作(例如类型双关或依赖溢出)的软件。这就是为什么我总是使用类型intX_t来避免歧义,并且如果实现不支持我想要的,就会提前失败。


    – 


  • 1
    @CPlus 加上任何要求 uint8_t 的代码,如果不进行可怕的模拟,我就无法支持它


    –