【问题标题】:what actually decide how many bits an integer is实际上决定一个整数有多少位
【发布时间】:2013-05-29 03:26:43
【问题描述】:

我正在为我的 android 设备编写一个应用程序。我正在执行一些本地开发。我正在使用 android-ndk-r8d/platforms/android-9。 所以现在在我的 C 代码中,我声明int j=2; 但是j是多少字节,是由什么决定的呢?我的 android 设备的 linux 内核还是 arm 芯片?我知道相应的汇编代码是

.data
j: .word 2 

但这并不能说明j 将占用多少空间。

【问题讨论】:

  • size of types in c/c++ 的可能重复项
  • 编译器/汇编器(由工具作者选择)由语言、C 或汇编等决定。它通常与通用寄存器大小相匹配,但并非总是如此。并且不必将一个编译器匹配到另一个编译器,或者将一个编译器匹配到一个汇编器,也不必将任何东西的一个版本匹配到任何东西。完全取决于工具作者。

标签: android assembly embedded


【解决方案1】:
  1. 体系结构和工具链定义了类型的大小,所以是的,它部分是 ARM,部分是您用来构建它的编译器。通常在 ARM 上,这意味着 32 位 int 类型。

  2. .word 汇编关键字将在汇编器文档中进行描述,它会让您知道类型有多大。通常.word 是 ARM 的 32 位类型。

【讨论】:

  • 不,它完全是编译器,而不是架构。当然,编译器配置通常出于方便和效率的考虑而受到架构的启发,但实际上它可以在其呈现的编程模型中完全忽略这一点,只要后端针对实际硬件即可。但是,如果程序员的内存视图要与执行模式匹配,则指针之类的大小需要与正在使用的寻址模式匹配。
  • 是的,没错。正如您所说,在实践中,该架构倾向于适合特定的实现选择。
  • @ChrisStratton 虽然理论上,没有什么是相同的。把java编译成字节码。但是,大多数编译器都努力提高效率。因此,他们将希望匹配底层硬件。所以,我认为theory和practice可能不同。第二,编译器经常努力实现 ABI 兼容,这是架构通过效率强制要求的。
  • 您不必在 vm 上运行编译器即可实现与 ALU 不同宽度的数据类型。 ABI 是程序员之间的合同,而不是与硬件的合同。我在一个使用编译器和 ABI 的平台上工作过,它指定了 32 位 int,尽管硬件效率最高的操作大小是 16 位 - 这样做是为了让它能够方便地运行 Linux。
  • @ChrisStratton 我提到了一个 VM 只是为了指出指针也不必匹配底层拱门。大多数编译器将匹配底层架构。编写“C”标准是为了允许这样做,并且没有其他标准,他们会这样做。当然,您可以制作一个不遵循拱门的系统。您的第一条评论似乎暗示编译器选择什么是完全反复无常的。 IE。 根本不是架构。
猜你喜欢
  • 2018-01-20
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 2016-08-11
  • 2021-05-12
  • 2015-03-19
相关资源
最近更新 更多