你能指望一个半现代的处理器能够用一个与指针大小相同的数据进行浮点计算吗?这种类型是否有定义的类型(可能在特定于平台的头文件中)?我是在intptr_t的效果之后但是对于浮点数。
编辑:
我不是指C的float
类型,而是指一般的浮点数。
编辑:
我是否需要运行脚本,测试float
,double和void *
的大小是否适合所使用的编译器,并生成适当的头文件typedef
类型其他代码使用?
答案 0 :(得分:4)
你最接近的是:
union floatptr_t {
float f;
void *p;
};
在不利方面,这并不是你要求的。从好的方面来看,它是100%的标准......
[编辑]
是的,您可以使用sizeof
将指针大小与float
,double
和long double
进行比较,然后选择一个。但是作为@R。指出,许多指针值将映射到NaN
,因此除了将它们强制转换为指针之外,您将无法对这些浮点值执行任何操作...即使这样也不能保证工作(尽管它可能会在实践中。)
但是如果你不能做任何具有浮点值的东西,除非把它重新抛回指针,那么你最好使用一个联合,因为这样做太节省空间了便携地工作。
答案 1 :(得分:2)
这当然很常见,因为“半现代”处理器几乎都有CHAR_BIT 8和对象指针大小为4或8,几乎所有都支持IEEE float(32位= 4字节)和double(64位= 8个字节)。所以通常会有一种相同尺寸的类型。毫无疑问,那里有一些“怪异”的架构
但正如R ..在注释中指出的那样,这并不一定意味着指针类型的所有值都可以由浮点类型表示,因为并非所有位模式都是有效值(以及一些有效的是NaNs,当你指定NaN时IIRC的结果肯定是NaN,但肯定不是相同的 NaN)。因此,此类型不会获得intptr_t
的效果。
答案 2 :(得分:1)
float
(a.k.a。单精度)是4个字节所以......是的,也许。
请注意,并非所有4字节值都是有效的浮点数,有些是NaN
,而不是数字。
你的问题的语气让我觉得你已经听说过处理器总线大小的实体上的原子操作。如果那是真的那么DON'T do it
,使用显式原子操作。它们使代码更具可读性,减少错误。