c - 用于不寻常架构的 C 指针算法
问题描述
我试图更好地理解 C 标准。特别是我对指针算法如何在不寻常的机器架构的实现中工作感兴趣。
假设我有一个带有 64 位宽寄存器的处理器,它连接到 RAM,其中每个地址对应一个 4 位宽的单元。这台机器的 C 实现将 CHAR_BIT 定义为等于 8。假设我编译并执行以下代码行:
char *pointer = 0;
pointer = pointer + 1;
执行后,指针等于 1。这给人的印象是,通常 char 类型的数据对应于机器上最小的可寻址内存单元。
现在假设我有一个带有 12 位宽寄存器的处理器,它连接到 RAM,其中每个地址对应一个 4 位宽的单元。这台机器的 C 实现将 CHAR_BIT 定义为等于 12。假设为这台机器编译和执行相同的代码行。指针是否等于 3?
更一般地,当您增加指向 char 的指针时,地址是否等于 CHAR_BIT 除以机器上存储单元的宽度?
解决方案
指针是否等于 3?
好吧,标准并没有说明指针是如何实现的。该标准告诉您以特定方式使用指针时会发生什么,而不是指针的值应该是什么。
我们所知道的是,将 1 加到 char 指针上,将使指针指向下一个 char 对象——无论它在哪里。但没有关于指针值的内容。
所以当你这么说
pointer = pointer + 1;
会使指针等于1,这是错误的。该标准对此没有任何说明。
在大多数系统上,achar
是 8 位,指针是(虚拟)内存地址,引用 8 位可寻址内存位置。在这样的系统上,增加一个 char 指针会将指针值(也就是内存地址)增加 1。但是,在不寻常的体系结构上,没有办法说出来。
++pointer
但是,如果您有一个系统,其中每个内存地址引用 4 位而 char 是 12 位,那么将指针增加 3似乎是一个不错的猜测。
推荐阅读
- c# - 具有动态宽度的矩形内的中心标签
- sql - 来自 N 个 SQL Server 数据库的 UNION 结果
- html - 使“选择一个菜单”primefaces 覆盖
- asp.net-core - 如何从 Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor 读取值
- python - 如何在“Tattoo”文本中执行 Playfair cypher?
- r - 如何用月份的全名替换数字月份
- python - django-admin正在执行,但virual目录中没有创建项目
- apache-kafka - 回复 Kafka 模板 - 异常处理
- amazon-cloudformation - 在 ECS 中使用应用程序负载均衡器的 504 网关超时
- django - 如何在表单中定义电话号码和模板错误获取:django.template.exceptions.TemplateDoesNotExist:phone_field/phone_widget.html?