【问题标题】:Prefixing hex value with 0x用 0x 前缀十六进制值
【发布时间】:2015-08-05 03:14:21
【问题描述】:

我在 OpenGL 中查询一个 GL_TYPE,它以整数形式返回十六进制值,as it should

例如:0x1406 被#define 定义为 GL_FLOAT,但它是从 OpenGL 以整数形式作为 5126 提供给我的。

不幸的是,OpenGL 不只是返回类型,它也不只是接受整数(读取:十六进制)值。它显然需要在使用前以 0x 为前缀。

我正在尝试为自己保存一个开关/外壳,而是即时转换/转换,但我没有看到其他方法。我还有其他选择吗?请不要提升。

【问题讨论】:

  • 你有这个发生的 MCVE 吗?这听起来很奇怪。
  • 是的,但此时它很长,所以我不想复制/粘贴。不过这是有道理的。 OpenGL返回一个整数,正如我的链接所指定的那样,当转换为十六进制时,这个整数就是glew.h中定义的类型(减去0x)。不知何故,我需要将整数与十六进制值相关联,而不必制作某种表格。
  • GLint 变量没有十六进制或十进制类型,这只是您如何打印出来的人工制品

标签: c++ opengl hex


【解决方案1】:

目前尚不清楚您想到的是哪种“转换”:0x1406 等于 5126。它们只是在源代码中编写相同数字的不同方式,编译器将它们都转换为运行时使用的二进制形式。

您应该能够只使用== 运算符将glGetProgramResource 的结果与GL_FLOAT 等常量进行比较,无论该常量在源代码中定义为0x1406 还是5126。

【讨论】:

  • 我知道它们是同一个数字,但我很惊讶 0x1406 和 5126 都能正常工作。它们是不同的基础,我想我没想到 GLenum 类型的函数参数能够在两者之间切换命中。但我刚刚对其进行了测试,它可以正常工作,所以我很高兴。
  • 我想这就是 0x 前缀的含义……只是为了表示“嘿,在将此数字用作 int 之前,您首先必须对其进行转换。所以我明白了您的意思说。
  • 听起来您认为int 类型本质上是十进制的,这是不正确的。 CPU 实际上使用紧凑的二进制表示,编译器的工作是将源代码中的数字转换为二进制表示。 “0x”前缀只是告诉编译器在将数字转换为可执行文件中的二进制形式时将数字解释为十六进制而不是十进制。无论您在源代码中以哪种方式编写数字,您都将获得完全相同的编译代码。
  • 但实际上,即使是二进制表示也不重要;您可能正在为某种 Babbage 引擎编译代码,该引擎通过计算卡片上打了多少孔来表示数字。真正重要的是编译器了解您在源代码中写入的数字,因此它可以以机器期望的形式生成该数字的表示。源代码中的基数和 CPU 中的基数是完全独立的。
  • 这正是我的想法。感谢您花时间解释!
猜你喜欢
  • 2011-02-09
  • 2016-03-15
  • 2020-02-09
  • 1970-01-01
  • 2020-07-23
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
相关资源
最近更新 更多