【问题标题】:How the compiler make the link between basic ANSI C type and the processor selected编译器如何在基本 ANSI C 类型和所选处理器之间建立联系
【发布时间】:2016-04-25 00:50:26
【问题描述】:

对于每个处理器(Cortex M、Cortex 5),编译器必须知道与unsigned char、integer、short、......相关的数据大小是多少。

请你帮我理解这个选择是怎么做的?

【问题讨论】:

  • 编译器里面有个源文件,里面有个表格,粗略的说。
  • 您基本上通过指定要编译的架构来告诉编译器。这将它指向头文件等定义这些东西。
  • 有些人告诉编译器他们的选择,编译器的作者或将编译器移植到该架构的人。等等。很多编译器特定而不是体系结构特定,并且可以随时随编译器的任何新版本而变化,或者某些编译器甚至可能具有命令行选项来改变这些定义。
  • 如果您在那里体验了世界 (x86) 中 16 位到 32 位的变化,那么您会看到 int 从 16 位变为 32 位。但是 unsigned long 是 32 位的,所以很多人采用 unsigned long 来获得一致的 32 位变量,该变量可以跨 16 位和 32 位编译器移植。我们仍处于从 32 位到 64 位的转换中,int 没有改变,但 long 改变了,所有使用 unsigned long 来避免改变的代码现在都被改变了。 stdint 试图解决这个问题,但这里再次有人制作了该文件以匹配编译器
  • 编译器和 stdint 头文件必须并行维护。 stdint 基本上是一种解决您可能遇到的问题的技巧。请注意,术语字节并不意味着 8 位,9 位在人们使用八进制时更有意义。没有规定一个字节必须是 8 位(从一种架构到另一个架构),也没有规定 char 必须是一个字节,也没有规定 int 必须是寄存器的大小或地址总线的大小。这是你作为程序员的工作,检查你的代码是否适合平台或使用习惯,碰巧更便携

标签: c types compiler-construction arm processor


【解决方案1】:

请你帮我理解这个选择是怎么做的?

猜测我们正在谈论的编译器是 C 编译器。

首先我们有 C 语言的规范,请参阅 wiki 文章 C data types。但是随后 C 规范为实现者提供了一些灵活性......

int 是架构的词。一个词是架构的几乎原子大小的处理。对于传统 ARM,这是 32 位,认为架构具有 32 位寄存器。

char 是最短的位串。现在你不能低于 8,几乎所有的架构都让你玩 8。8 很好,因为它与 ASCII 匹配,所以你可以从架构中得到有效的支持来播放 ASCII 字符串。

short 有助于您的架构可以对 16 位值进行操作,而long 适用于 64 位。

signed / unsigned与此没有真正的关系,因为当某些位串被用作签名时,它可以表示的上限会降低。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    相关资源
    最近更新 更多