Kev*_*lia 5 c# double casting long-integer
所以我总是理解,铸造意味着取一些东西,并将其解释为铸造实体(必要时截断).但是我注意到在C#中,你可以使用一个双精度,这是一个包含指数和值的64位表示.您可以将其强制转换为long,这是一个没有指数的整数的64位表示.因此,在我看来,如果你把一个随机的十进制值(比如说10.43245)存储在一个double中,然后将它转换为long,你会得到一些随机数,恰好是那个二进制文件在长.然而,这不是发生的情况,您只需获得截断的十进制值和值10.
我对铸造的定义是错误的吗?或者c#在这里稍微弯曲规则给程序员更多他们可能期望从这样的演员(我也假设java可能做同样的事情,c ++怎么样?)
它没有什么神奇的,但它所做的不仅仅是位的直接转换。例如,看看如何在汇编中将浮点数转换为整数:
[参考: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)
它先移动,然后修剪,然后减去,然后再次移动。
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |