【问题标题】:Weird register hex value 0x010000edu in QEMU edu PCI deviceQEMU edu PCI 设备中奇怪的寄存器十六进制值 0x010000edu
【发布时间】:2020-10-23 08:29:37
【问题描述】:

在 QEMU edu PCI 设备的sourcecode 中,用 C 编写,进行了以下分配:

val = 0x010000edu;

(在documentation中也有说明)。

这应该是存储在设备内部寄存器中的值,偏移量为0x00(第一个)。 u 不是十六进制值。实际上从操作系统读取寄存器的内容,只显示0x010000ed

上面的赋值val = 0x010000edu似乎毫无意义。那么,为什么会这样呢?


在一个测试程序中,我可以:

# include <stdio.h>
# include <inttypes.h>

void main() {
uint32_t testvalue = 0x010000edu;
printf("%08x\n", testvalue);
}

它成功编译并在屏幕上打印001000ed。但是:

uint32_t testvalue = 0x010u00ed;

会引发编译器错误:

test.c: In function ‘main’:
test.c:9:19: error: invalid suffix "u00ed" on integer constant
    9 |  uint32_t testvalue = 0x010u00ed;
      |                       ^~~~~~~~~~

我不明白为什么u 在这两种情况下都没有被拒绝,因为它不是hex 数字。

【问题讨论】:

  • 我不明白。您是否仅对 u 后缀感到困惑?还是你问0x010000ed值是什么意思? seems meaningless. 为什么?它将0x010000ed 分配给变量val,似乎在做一些有意义的事情。
  • @KamilCuk 我对十六进制表达式上出现u 感到困惑。 u 不是十六进制数字...

标签: c hex variable-assignment qemu pci


【解决方案1】:

C 语言中的整数常量 可以有一个后缀,它决定/改变整数文字的类型。见cppreference integer constant

使用带有十六进制整数常量的后缀uU 将文字的类型更改为unsigned int unsigned long intunsigned long long int。后缀 u 用于指定要无符号的文字类型,在这种情况下,0x010000ed 可以是 intlong,具体取决于架构,分配给uint32_t 变量。或者someone has to follow rules,或者它可以作为该值未签名的文档。

@edit 在 C 中是“整数常量”,在 C++ 中是“字面量”

【讨论】:

  • 好的!几个疑问:1)在我的示例 C 程序中,testvaluedeclared 为无符号,没有特定的样式义务,可能使用尾随 u,但没有必要。这是正确的吗? 2) 就我而言,testvalue 不是一个常数。但也许 integer constant 是指任何固定值,即使是那些分配给 variable 的值。
  • 1) 好吧,总是可以为整数常量添加后缀。这是程序员的决定。因为在赋值中使用了常量,是的,我认为不需要在此处添加u 后缀。就个人而言,我认为这是一种很好的风格。 2) 不是吗?术语整数常量我的意思是C标准定义为integer constant - 一个十六进制前缀0x,后跟[0-9a-fA-F]+,可选后跟一个后缀。
  • 非常感谢您的帮助和耐心。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 2014-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多