【问题标题】:How does c store a double decimal in an 8 bit slot?c如何将双十进制存储在8位插槽中?
【发布时间】:2011-10-09 03:43:39
【问题描述】:

c 如何在 8 位插槽中存储双位小数?

#include "stdio.h"

main(){
  double x = 123.456;
  printf("\n %d - %e \n",sizeof(x),x);
}

输出:

8 - 23.456

x的值是123.456是正确的,但据说只有8位。

【问题讨论】:

  • sizeof 返回一个size_t,在技术上应该使用"%zu" 打印。如果您的编译器很好(并且您打开警告),它可能会给您一个警告。 (另外,main() { ... } 看到有点痛,即使它是合法的。)
  • @ChrisLutz: main() { ... } 在 C90 中是合法的,但在 C99 中是非法的。当然int main(void) { ... } 两者都更可取。

标签: c double decimal


【解决方案1】:

这不是 8 位。它是 8 个字节。而且每个字节至少有 8 位(通常正好是 8 位)。

所以double 可能是 8 * 8 = 64 位。

编辑:

sizeof() 运算符产生对象的大小以字节为单位

一个“字节”的定义是char 的大小。 (这就是 C 标准对“字节”一词的定义;它在其他上下文中可能有不同的含义。)

一个字节中的位数由宏CHAR_BIT 指定,在<limits.h> 中定义。几乎您可能遇到的任何系统都会有CHAR_BIT == 8,但我知道一些 DSP(数字信号处理器)的实现将CHAR_BIT 设置为 16 或 32。

【讨论】:

  • 你知道任何解释小数如何在c中存储的文章吗?
  • 如果你的意思是浮点数中的“小数”,那么只需查看维基百科文章:(en.wikipedia.org/wiki/Floating_point) 它实际上是以二进制形式存储的。
  • 从技术上讲,每个“字节”是CHAR_BIT 位,所以sizeof(double) * CHAR_BIT 是存储double 的位数。(实际上,当然,它几乎总是64 .)
  • @Chris Lut:是的,我刚刚在维基百科上查了一下,发现“字节”实际上并没有定义为 8 位。 (尽管它似乎一直都是)
  • 我刚刚编辑了答案以更正术语的使用。一个字符正好是一个字节;这就是 C 标准定义“字节”这个词的方式。
【解决方案2】:

为了可怕的迂腐sizeof 返回操作数的大小为sizeof char 的倍数。

在所有常见平台上,这意味着 sizeof 以字节为单位返回。

【讨论】:

  • 为了更迂腐,“字节”没有固定的定义(它不一定是八位字节),有些人会将其定义为相当于char的大小。
  • @MatthewFlaschen:C 标准将字节定义为 char 的大小(至少为 8 位)。
  • 没错,这个词是历史性的。回到第一个微处理器问世时,它们会一次处理 8 位“字节”数据。一个 8 位字节的味道刚好足以传达一些有价值的东西。
猜你喜欢
  • 2016-05-11
  • 2020-10-14
  • 2020-01-05
  • 1970-01-01
  • 2019-07-18
  • 2011-07-17
  • 2013-05-13
  • 2018-06-24
  • 2014-02-20
相关资源
最近更新 更多