【问题标题】:Does sizeof(float) always equal to sizeof(int) on all architectures?sizeof(float) 在所有架构上总是等于 sizeof(int) 吗?
【发布时间】:2012-08-03 17:00:43
【问题描述】:

我看到代码使用 sizeof(int) 为浮点分配内存。
我想知道sizeof(float) 在所有架构上是否总是等于sizeof(int)

float *pointer2Float = (float *) USER_DEFINED_MALLOC (...,..., sizeof(int))

注意:我认为这个 USER_DEFINED_MALLOC 是传统 malloc 的包装器。

谢谢

问候

【问题讨论】:

  • 您甚至不必在意。如果分配浮点数,请使用浮点数的大小。此外,无论如何都应该使用sizeof(*ptr) 而不是sizeof(int)
  • 否 - 有 64 位平台是 ILP64,其中 int 是 8 个字节,但 float 仍然是 4 个字节。还有 16 位平台,其中 int 是 2 个字节,float 仍然是 4 个字节。
  • 还要记住,数据类型不绑定到架构。它们由任意数据模型定义,从技术上讲,任何人都可以为任何 CPU 架构提出新的模型。 64 位平台上最常见的数据模型将long 设置为64 位,将int 设置为32 位,但这只是因为它方便,而不是因为某些技术限制。

标签: c++ c memory malloc sizeof


【解决方案1】:

不,有 16 位 int 和 32 位 float 的实现(主要是嵌入式系统)。

当然,根据标准,尺寸允许完全不同。

【讨论】:

  • 如果架构仅限于 64 位 Intel Nehalem/Sandy_bridge 和 AMD Opteron,此说法是否正确
  • @elgnoh,我相信对于这些平台上的大多数常见 ABI,sizeof(int)==sizeof(float) 确实如此,但理论上不可能有一个特定的系统,而不是这种情况(对于例如,int 很容易是 64 位)。
  • 如果您打赌这些架构上的所有实现都有 32 位 int 和 32 位 float,我认为您输掉赌注的风险非常小。但不能保证,有人可以用 64 位 int 和 32 位 float 来实现。
  • 值得记住的是 sizeof() 以字符而不是字节为单位返回类型的大小。在许多嵌入式处理器中,尤其是 dsp char 是两个字节。
  • @nyholku 就标准而言,一个字节定义char的大小。这可能是 8 位或 16 位(或者,就此而言,9;CHAR_BIT 告诉你),它不必是八位字节。 (通常的说法是,大多数人在说字节时指的是八位字节,因此存在误解和偶尔发生的灾难的空间。)
【解决方案2】:

所有类型的大小(charsigned charunsigned char1 除外)是实现定义的。所以在所有平台上保证sizeof(float)将等于sizeof(int)

1. char 及其所有变体的大小由标准定义为 1 字节。但是,1 字节中的 number 位是实现定义的!

【讨论】:

    【解决方案3】:

    不,sizeof (int)sizeof (float) 值是实现定义的,不保证相同。

    这是两个值不同的系统示例:

    在 Cray MPP 系统上:

    sizeof (int)  is 8
    
    sizeof (float) is 4
    

    看这里:

    《Cray C/C++ 参考手册》,表 3.《9.1.2.2 类型》中的 Cray Research 系统数据类型映射

    http://docs.cray.com/books/004-2179-003/004-2179-003-manual.pdf

    此外,大多数 8 位嵌入式系统的 int 为 16 位宽,sizeof (int) 为 2,而浮点遵循 IEEE-754,float 为 32 位,sizeof (float) 为 4。

    【讨论】:

      【解决方案4】:

      没有。在 C 和 C++ 中,数据类型是特定于平台的。一般来说,这意味着:

      但对于其他系统,一般规范是 int 具有系统架构(一个“单词”)建议的自然大小,并且四种整数类型 char、short、int 和 long 必须至少与前面的那个,char 总是一个字节的大小。这同样适用于浮点类型 float、double 和 long double,其中每一种都必须提供至少与前一种一样高的精度。

      (取自Data Types

      在许多平台上,float 和 int 通常都是 32 位的,但情况并非总是如此,也不是实际规范的一部分。

      【讨论】:

        【解决方案5】:

        绝对不能保证sizeof (float) 等于sizeof (int),我认为以上是编码错误。

        应该使用sizeof *ptrToFloat 代替sizeof (int)sizeof (float)

        【讨论】:

          【解决方案6】:

          如果你正在编写一个数据类型大小非常重要的多平台,你可以创建一个头文件,例如:

          #define INT sizeof(int)
          #define FLOAT sizeof(float)
          .
          .
          .
          

          这是欺骗拱门的伎俩。

          【讨论】:

            猜你喜欢
            • 2010-11-09
            • 1970-01-01
            • 2012-02-13
            • 2019-02-12
            • 1970-01-01
            • 1970-01-01
            • 2013-09-19
            • 2017-03-26
            相关资源
            最近更新 更多