【问题标题】:How do we know if a set of bits forms a real or an integer number?我们如何知道一组位是形成实数还是整数?
【发布时间】:2015-07-09 18:08:11
【问题描述】:

给定一组位 (64),计算机如何知道它们属于实数还是整数?

【问题讨论】:

  • 这个决定不是留给实现架构的人(或者更好的是编译器)吗?也许你可以澄清你的问题或添加一个例子。
  • 您是指实数还是整数?计算机不会知道,但程序员/编译器会根据是一个还是另一个,使用不同的指令。
  • 弱类型硬件 (TM)
  • 你能把它改写成一个编程问题吗?你从哪里得到的 64 位?
  • 这与询问它是有符号整数还是无符号整数相同 - 它可以是任何东西,具体取决于您如何解释它。

标签: computer-science computer-architecture


【解决方案1】:

大多数现代计算机没有硬件类型标签,因此 64 位存储块就是 64 位数据块,这意味着什么。它可以是一个有符号的 64 位整数,也可以是一个无符号的 64 位整数、一个 64 位浮点数、两个 32-but(重复之前的数据类型)。也许是 4 个 16 位整数?也许它是一个 7 字符的字符串,前导 8 位字符串长度?

它们之间的区别在于实际执行的机器指令。因此,打字是由指令决定的,而不是由内存决定的。

【讨论】:

    【解决方案2】:

    电脑不知道也不在乎。

    由程序决定是否应该将特定内存用作整数(长整数)、实数(双精度)或字符数组。

    根据语言的不同,相同的值可以在不同的时刻用作双精度实数、长整数或 8 个字节

    使用C语言的例子:

    #include <stdio.h>
    
    int main(){
        double r = 12.5;
        void *pt = &r;
        long long unsigned int *up = pt;
        char *cp = pt;
        int i;
    
        printf("Real : %f\n", r);
        printf("Int  : %llx\n", *up);
        for (i=0; i<8; i++) {
            printf("%02x", cp[i]);
        }
        printf("\n");
    
        return 0;
    }
    

    输出:

    Real : 12.500000
    Int  : 4029000000000000
    0000000000002940
    

    将 float 指针转换为 int 指针在形式上是未定义的行为,但它在 little endian 32 位系统上的工作方式类似。

    【讨论】:

      猜你喜欢
      • 2014-09-11
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      • 2019-02-20
      相关资源
      最近更新 更多