【问题标题】:Size of int on 8-bit machines8 位机器上的 int 大小
【发布时间】:2016-11-17 05:54:48
【问题描述】:

ISO C 标准规定A "plain" int object has the natural size suggested by the architecture of the execution environment

不过,也保证 int 至少和 short 一样大,至少 16 位大小。

8 位处理器(例如 6502 或 8080)建议的自然大小似乎是 8 位 int,但是这会使 int 短于 16 位。 那么,在这些 8 位处理器之一上 int 会有多大?

【问题讨论】:

  • C 和 C++ 保证sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long),因此int 永远不会小于short,即使“自然”大小是其他的。 C++ 保证short 至少为 16 位。不确定 C 是否做出同样的保证。
  • N1548 的第 5.2.4.2.1 节:SHRT_MAXINT_MAX 必须至少为 32767

标签: c int sizeof 8-bit


【解决方案1】:

来自Section 6.2.5 Types, p5

5 声明为signed char 类型的对象占用与“普通”char 对象相同的存储量。 ''plain'' int 对象具有执行环境架构所建议的自然大小(大到足以包含标题 <limits.h> 中定义的 INT_MIN 到 INT_MAX 范围内的任何值)。

还有5.2.4.2.1 Sizes of integer types <limits.h> p1

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

...

  • int 类型对象的最小值

    INT_MIN -32767 // -(215 - 1)

  • int 类型对象的最大值

    INT_MAX +32767 // 215 - 1

那么在那些平台上,int 必须至少为 16 位

【讨论】:

  • 然而,实际上,有些人可能会使用 8 位 intavr-gcc-mint8 开关。
【解决方案2】:

6502只有指令指针作为16位寄存器,16位整数用8位处理多个语句,例如如果你用 16 位做c = a + b

clc                 ; clear carry bit
lda A_lo            ; lower byte of A into accumulator
adc B_lo            ; add lower byte of B to accumulator, put carry to carry bit
sta C_lo            ; store the result to lower byte of C
lda A_hi            ; higher byte of A into accumulator
adc B_hi            ; add higher byte of B using carry bit
sta C_hi            ; store the result to higher byte of C

当时的 8080 和 Z80 CPU 也有 16 位寄存器。

Z80 CPU 仍然是 8 位架构。它的 16 位寄存器最终配对了两个 8 位寄存器,例如 BC、DE。由于 CPU 架构是 8 位,因此它们的操作比使用 8 位寄存器要慢得多,但这种方式提供了 16 位寄存器和 16 个操作。

8088 架构是混合的,因为它也有 8 位数据总线,但它有 16 位寄存器,AX,BX 等,低字节和高字节也可分别用作 8 位寄存器,AL,AH 等。

所以有不同的解决方案来使用 16 位整数,但 8 位根本不是一个有用的整数。这就是 C 和 C++ 也将 16 位用于 int 的原因。

【讨论】:

  • 我曾经在 6809(8 位)架构上使用 Introl-C 编译器,sizeof(int) 是 16 位。 6809 也有内部 16 位寄存器。
  • 6502 肯定没有任何 16 位寄存器。你有 8 位 A、8 位 X 和 8 位 Y。甚至堆栈指针也是 8 位。你可以说指令指针是 16 位的,但它是不可访问的,并且 指令指针
猜你喜欢
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-05
  • 2015-08-03
  • 2018-03-10
相关资源
最近更新 更多