你能装饰一个十六进制常量,所以它被解释为一个浮点数吗?

时间:2011-08-01 23:17:07

标签: opengl casting floating-point hex integer-division

对某事感到好奇。虽然将HTML颜色(其各个颜色组件通过2位十六进制值表示)转换为介于0.0和1.0之间的浮点数,因此我们可以将它们与OpenGL一起使用,但我对某些内容感到好奇。我们必须将十六进制值除以255给我们它们的OpenGL对应物,但我们不能简单地使用十六进制值,因为这会产生整数除法。

现在我知道这些都围绕这个问题(当然)......

float r = 0xFD / (float)0xFF; // Works because of the cast to float

float r = 0xFD / 255.0f;      // Works because of the explicit float 

float d = 0xFF;
float r = 0xFD / d;           // Works because 'd' is a float 

...但我想知道是否有任何方法只是装饰一个十六进制值,因此它被解释为一个浮点数(就像你在1.0f中使用'f'一样),而不必进行转换,计算或临时变量。

这些当然不起作用......

float r = 0xFD / 0xFF;   // Integer division yields an integer, not float

float r = 0xFD / 0xFFf;  // Interprets 'f' as part of the hex value

同样,不要试图找到如何实现我所需的结果,因为我的代码工作得很好。我只是想知道我是否可以通过使用类似于“f”如何使用十进制值的方式来修改十六进制值而不是使用上述三种可行的方法来使代码更清晰。

4 个答案:

答案 0 :(得分:1)

这可能在使用user defined literals的c ++ 0x中有可能,但我怀疑在c ++ 03中有任何巧妙的方法可以做到这一点。

答案 1 :(得分:0)

我不知道有什么方法可以完全按照你的要求去做,但如果你想重复使用0xFF,为什么不把它设为常数?这仍将保留打字,即:

const float divisor = 0xFF
float r = 0xFD / divisor

我认为这样可以解决您正在寻求解决的问题,即使它并非完全相同。

答案 2 :(得分:0)

你可以做的一种方法是定义你自己的模式来定义十六进制浮点数,0xff定义十六进制整数,你可以创建一个宏,如:

#define 0y (float) 0x

然后你就写了

float r = 0xAF / 0yFF;

做你的浮动师。

这个解决方案虽然可能会让读取代码的其他人产生混淆,但如果代码主要是针对您的,那么就可以这样做了

答案 3 :(得分:0)

我担心您必须使用预处理器定义才能获得最佳外观。而且你还需要强制执行计算。

我能想到的最佳解决方案是

#define COMPONENT8(value) ((float)(value) / 255.0f))

不能将浮点值指定为十六进制(整数)值。