【问题标题】:Usefulness of unsigned char in on embedded systems in C [closed]无符号字符在 C 中的嵌入式系统上的用处 [关闭]
【发布时间】:2016-04-29 01:04:18
【问题描述】:

我正在用 C 语言开发一个 Chip-8 仿真器,目标是让它尽可能跨平台并尽可能小,以便与嵌入式系统和低规格系统兼容(并挑战我自己),这意味着能够使用 SDL、ncurses(当我达到这一点时)和其他东西。因此,我一直在使用无符号字符来代替整数或无符号整数,并且我使用了“typedef unsigned char byte”以使其更方便。我是在浪费时间吗,即使是为了理想地使其与非常小的系统兼容,还是只使用“typedef unsigned int byte”就足够了而不牺牲性能?

【问题讨论】:

  • 我不知道 Chip-8,但我在谷歌上看到的是 8 位的。假设 int 类型也有 1 个字节的大小和 char,则无所谓使用typedef unsigned int 或typedef unsigned char。它们具有相同的效果。
  • 是的,Chip-8 是一种 8 位语言,但我关心的不是解释器/仿真器本身,而是主机系统。那么 int 的大小会随着它编译的系统而改变?
  • 尝试打印 sizeof(int)。对于该目标,该编译器很可能是 1 个字节,这是 int 变量类型的一种想法,它取决于目标(比 char 或 long 更多)。

标签: c resources embedded memory-footprint


【解决方案1】:

您应该将解释器与 io 绑定分开。

只有解释器需要 8 位可移植。

每个目标平台都有一组不同的可用于 IO 的技术。

SDL 或 curses 将为您提供*nix 和 Windows 平台之间的某种可移植性,但如果可用,您可能会有 32 位整数,可能必须处理 16 位。但肯定不是 8 位整数。

另一方面,处理 8 位和 16 位裸机处理器意味着您可能只需将项目直接挂接到图形驱动程序。

【讨论】:

  • 它主要使用 8 位来专门处理指令集本身。那么我应该只使用或处理带有指令集/cpu 结构的 8 位整数和其他所有内容的常规无符号整数吗?
  • 是的,除非您有特定的 8 位目标。除了一些流行的 pic 和 avr 16 位控制器,它们的成本与 32 位演变相同。
  • 理想情况下,我希望它能够与人类可能的每个系统兼容。同样,对于挑战,这就是我最初从 8 位整数开始的原因,以及为什么我将 ncurses 作为 SDL 的替代方案的原因
  • curses 不能替代every system humanly possible,但足以替代almost every *nix system ever。如果您是为了挑战而这样做,请下载 PDP-11 仿真器并让您的代码在那里工作。 (您可能会遇到一些 C 可移植性问题,因为您可能会处理预标准化的编译器)。
  • 我会在必要时添加另一个图形替代方案,ncurses 只是我想到的第一件事。而且我没有考虑过 PDP-11 大型机。有一次,我在 Living Computer Museum 的大型机上有一个 telnet 帐户,但模拟器也可以。
【解决方案2】:

您的基本想法是正确的,但不是解决方案。在现代 C 中,我们在 stdint.h 中有 uint_fast8_t 类型。

这是您应该使用的类型,这意味着您要告诉编译器:“这个整数不需要超过 8 个字节,但如果可以提高性能,请随意使用更大的大小。”

【讨论】:

  • 但是在构建到 DOS 之类的东西时,这不会导致可比性问题吗?
  • @Josh 你为什么要为 DOS 构建?不,它根本不会引起任何兼容性问题,这就是 stdint 类型的美妙之处。虽然,由于您不知道整数有多大,因此在考虑隐式类型提升时,您必须将其视为 uint8_t。
猜你喜欢
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2016-08-09
相关资源
最近更新 更多