Casting是解释价值还是仅仅是比特?

Kev*_*lia 5 c# double casting long-integer

所以我总是理解,铸造意味着取一些东西,并将其解释为铸造实体(必要时截断).但是我注意到在C#中,你可以使用一个双精度,这是一个包含指数和值的64位表示.您可以将其强制转换为long,这是一个没有指数的整数的64位表示.因此,在我看来,如果你把一个随机的十进制值(比如说10.43245)存储在一个double中,然后将它转换为long,你会得到一些随机数,恰好是那个二进制文件在长.然而,这不是发生的情况,您只需获得截断的十进制值和值10.

我对铸造的定义是错误的吗?或者c#在这里稍微弯曲规则给程序员更多他们可能期望从这样的演员(我也假设java可能做同样的事情,c ++怎么样?)

Ben*_*rey 2

它没有什么神奇的,但它所做的不仅仅是位的直接转换。例如,看看如何在汇编中将浮点数转换为整数:

[参考:http://www.codeproject.com/Articles/10679/Convert-Float-to-Int-using-Assembly-Language-Progr]

int ftoi(float flt)
{
    int i;
    _asm
    {
        mov  eax,flt; //loaded mem to acc
        rcl  eax,1;   //left shift acc to remove the sign
        mov  ebx,eax; //save the acc
        mov  edx,4278190080; //clear reg edx;
        and  eax,edx; //and acc to retrieve the exponent
        shr  eax,24;
        sub  eax,7fh; //subtract 7fh(127) to get the actual power 
        mov  edx,eax; //save acc val power
        mov  eax,ebx; //retrieve from ebx
        rcl  eax,8;     //trim the left 8 bits that contain the power
        mov  ebx,eax; //store
        mov  ecx, 1fh; //subtract 17 h
        sub  ecx,edx; 
        mov  edx,00000000h;
        cmp  ecx,0;
        je   loop2;
        shr  eax,1;
        or   eax,80000000h;        
loop1:    
        shr  eax,1; //shift (total bits - power bits);
        sub  ecx,1;
        add  edx,1;
        cmp  ecx,0;
        ja   loop1;
loop2:  
        mov  i, eax;        

//check sign +/-        
sign:
        mov  eax,flt;
        and  eax,80000000h;
        cmp  eax,80000000h;
        je     putsign;
    }

    return i;

putsign:
    return -i;
}
Run Code Online (Sandbox Code Playgroud)

它先移动,然后修剪,然后减去,然后再次移动。