gpt4 book ai didi

c# - Casting 是解释值还是只解释位?

转载 作者:太空狗 更新时间:2023-10-29 22:26:19 24 4
gpt4 key购买 nike

所以我一直理解转换意味着获取某些东西的二进制,并将其解释为转换后的实体(必要时截断)。但是我注意到在 C# 中,您可以使用 double ,这是一个 64 位表示形式,包括指数和值。您可以将其转换为 long,这是一个没有指数的整数的 64 位表示。因此,在我看来,如果您将一个随机十进制值(例如 10.43245)存储在一个 double 中,并将其转换为一个长整数,您将得到一些随机数,该随机数恰好是该二进制数在一个长整数中的值.然而,事实并非如此,您只是得到截断的小数点和 10 的值。

我对类型转换的定义是错误的吗?或者 c# 是否在这里稍微改变了规则,以便为程序员提供更多他们可能对此类转换的期望(我还假设 java 可能做同样的事情,那么 c++ 呢?)

最佳答案

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

[引用: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;
}

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

关于c# - Casting 是解释值还是只解释位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24901012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com