【问题标题】:Long Integer and Float长整数和浮点数
【发布时间】:2011-01-10 09:22:28
【问题描述】:

如果 Long Integer 和 float 都需要 4 个字节来存储在内存中,那么为什么它们的范围不同?

【问题讨论】:

    标签: c++ c architecture floating-point types


    【解决方案1】:

    整数的存储方式如下:

    • 1 位符号 (+/-)
    • 31 位的值。

    浮点数的存储方式不同,以牺牲准确性为代价提供更大的范围:

    • 1 位符号 (+/-)
    • 尾数 S 的 N 位
    • 指数 E 的 M 位

    浮点数以指数形式表示:(+/-)S*(base)^E

    顺便说一句,“长”并不总是 32 位。见this article

    【讨论】:

    • 我会投赞成票,但我在每个“是”和“是”之后都缺少“通常”这个词。
    • 整数通常不与符号位一起存储,它们通常存储在二进制补码中 - en.wikipedia.org/wiki/Two%27s_Complement
    • 二进制补码有符号位
    • @avakar:你能说得更直白一点吗?您的意思是在使用无符号类型的情况下省略符号位的可能性吗?
    • "1 位符号,31 位实际值" 不适合 2s 补码 - 所有位都是实际值的一部分,即使第一位可用于查找数字的符号.
    【解决方案2】:

    编码数字的不同方式。

    Long 从 1 计数到 2^(4*8)。

    浮点数仅使用 32 位中的 23 位进行“计数”。但它在其他位中添加了带有指数的“范围”。所以你有更大的数字,但它们不太准确(在较低的基础部分):

    1.2424 * 10^54(尾数 * 指数)肯定大于 2^32。但是您可以从长 2^31-1 中辨别出长 2^31,而您无法辨别浮点 1.24 * 10^54 和浮点 1.24 * 10^54 - 1:在这种表示中,1 只是丢失了浮动。

    【讨论】:

      【解决方案3】:

      它们的大小并不总是相同。但即使它们是,它们的范围也是不同的,因为它们服务于不同的目的。一种用于无小数位的整数,一种用于小数。

      【讨论】:

        【解决方案4】:

        这可以解释为什么浮点表示可以表示比定点表示更大范围的数字。本文来自Wikipedia entry

        浮点的优势 定点表示(和 整数)表示是它可以 支持更广泛的价值观。 例如,一个固定点 有七位小数的表示 数字,假定小数点 定位在第五个之后 数字,可以表示数字 12345.67、8765.43、123.00 等,而浮点数 表示(如 IEEE 754 decimal32 格式),带七位小数 数字还可以代表 1.234567、123456.7、0.00001234567、1234567000000000 等。这 浮点格式需要稍微 更多存储空间(对位置进行编码 小数点的),所以当存储在 相同的空间,浮点数 在实现他们更大的范围 牺牲精度。

        【讨论】:

          【解决方案5】:

          一个浮点数确实需要 4 个字节(32 位),但由于它是一个浮点数,因此您必须在这 32 位中存储不同的内容:

          • 1 位用于符号 (+/-)
          • 8位用于指数
          • 23 位用于有效数字(有效数字)

          您可以看到,浮点数的范围直接取决于分配给有效数字的位数,而最小值/最大值取决于分配给指数的位数。

          上面的例子:

          • 8 位的指数(= 字符的大小)给出了指数范围 [-128,127] --> 最大值约为 127*log10(2) = 10^38

          对于长整数,您有 1 位用于符号,然后 31 位用于表示导致最大值为 2 147 483 647 的整数值。

          您可以查看 Wikipedia 以获取更准确的信息: Wikipedia - Floating point

          【讨论】:

            【解决方案6】:

            它们的范围不同,因为它们使用不同的数字表示方式。

            long (c) 等价于long int。这种类型的大小因处理器和编译器而异,但正如您所说,通常是 32 位。在 32 位上,它可以表示 232 个不同的值。由于我们经常要使用负数,因此计算机通常使用称为“two's complement”的格式来表示整数。这样,我们可以表示从 (-231) 到 (231-1) 的数字。算上数字 0,总共有 232 个数字。

            float(在 c 中)通常是单个精度 IEEE 754 格式的数字。在 32 位上,这种数据类型也可以采用 232 个不同的位模式,但它们不用于直接表示整数,就像在 long 中一样。相反,它们代表一个符号,以及一个标准化十进制数的尾数和指数。

            【讨论】:

            • -1。 float 可以,但不必是 IEEE754。如果是,则它没有 2^32 值。 bitpattern只有2^32个,有些值(比如0)可以用多个bitpattern来表示。
            • “值”这个词的使用是模棱两可的——我确实试图解释不同的位模式不直接映射到数值。已更正。
            【解决方案7】:

            一般来说:当你有更多的值范围时(float 最多有 10^many),你的精度就会降低。

            这就是这里发生的事情。如果您需要整数,32 位长会提供更多。

            【讨论】:

              【解决方案8】:

              在handwavey 高级中,浮点会牺牲整数精度来扩展其范围。这是通过将基值与比例因子相结合来完成的。对于大值,浮点数无法精确表示所有整数,但对于小值,它比整数精度更好。

              【讨论】:

                【解决方案9】:

                不,C 中原始数据类型的大小是实现定义的。

                This wiki 条目明确指出:The floating-point format needs slightly more storage (to encode the position of the radix point), so when stored in the same space, floating-point numbers achieve their greater range at the expense of precision.

                【讨论】:

                • 最小尺寸由标准规定。顺便说一句,被否决的不是我。
                • 确实如此。但 Dinesh 概括了 long intfloat 占用 4 个字节的事实。
                猜你喜欢
                • 1970-01-01
                • 2011-01-04
                • 2017-07-26
                • 2012-02-11
                • 2015-01-20
                • 2011-04-20
                • 1970-01-01
                • 2017-11-16
                • 2010-12-26
                相关资源
                最近更新 更多