使用MemSet(…)合法吗, ;0, ;…)在一系列的双打上? [英] Is it legal to use memset(…, 0, …) on an array of doubles?
本文介绍了使用MemSet(…)合法吗, ;0, ;…)在一系列的双打上?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
将Double数组(使用memset(…, 0, …)
)或包含Double的结构的内存清零合法吗?
这个问题意味着两件不同的事情:
从C标准的角度看:这是NOT的未定义行为吗?(我认为,在任何特定的平台上,这都不可能是未定义的行为,因为它只是取决于内存中浮点数的表示形式--仅此而已。)
从实际角度看:在英特尔平台上可以吗?(不管标准是什么。)
推荐答案
C99标准附件F规定:
本附件指定了对IEC 60559浮点标准的C语言支持。这个
IEC 60559浮点标准是专门用于以下目的的二进制浮点算法
微处理器系统,第二版(国际电工委员会60559-1989年),以前指定
IEC 559:1989和AS二进制浮点算术的IEEE标准
(ANSI/IEEE754−1985年)。IEEE基数无关浮点标准
算法(ANSI/IEEE854−1987)概括了要删除的二进制标准
依赖于基数和字长。IEC 60559一般指的是浮点
标准,如在IEC 60559操作、IEC 60559格式等中
定义__STDC_IEC_559__
应符合本附件中的规范。哪里
指示了C语言和IEC 60559之间的绑定,指定了IEC 60559
除非另有说明,否则行为以引用方式采用。
和紧随其后:
C浮点类型与IEC 60559格式匹配如下:
float
类型与IEC 60559单一格式匹配。double
类型与IEC 60559双格式匹配。
因此,由于IEC 60559基本上是IEEE754-1985,并且由于这指定8个零字节表示0.0(正如@David Heffernan所说),这意味着如果您发现__STDC_IEC_559__
已定义,您可以使用memset
安全地执行0.0初始化。
这篇关于使用MemSet(…)合法吗, ;0, ;…)在一系列的双打上?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文