Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将long.MaxValue转换为int与将float.MaxValue转换为int有什么区别?_C#_Types_Casting - Fatal编程技术网

C# 将long.MaxValue转换为int与将float.MaxValue转换为int有什么区别?

C# 将long.MaxValue转换为int与将float.MaxValue转换为int有什么区别?,c#,types,casting,C#,Types,Casting,我试图理解一些数据类型和转换之间的区别 public static void ExplicitTypeConversion2() { long longValue=long.MaxValue; float floatValue = float.MaxValue; int integerValue = (int) longValue; int integerValue2 = (int)floatValue; C

我试图理解一些数据类型和转换之间的区别

public static void ExplicitTypeConversion2()
    {
        long longValue=long.MaxValue;
        float floatValue = float.MaxValue;
        int integerValue = (int) longValue;
        int integerValue2 = (int)floatValue;
        Console.WriteLine(integerValue);
        Console.WriteLine(integerValue2);            
    }
当我运行该代码块时,它会输出:

-1
-2147483648
我知道,如果要分配给整数的值大于该整数可以保持的值,它将返回整数的最小值(-2147483648)

据我所知,
long.MaxValue
远大于整数的最大值,但如果我将
long.MaxValue
强制转换为
int
,它将返回-1


这两种演员有什么不同?我想第一个也应该返回-2147483648而不是-1。

long的二进制值。MaxValue是
0111…111111
(一个零后跟63个一)。当您强制转换到
int
时,将保留最低32位
111…11111
。这是十进制的
-1
,因为
int
有符号的
,2的补码适用

如果要分配给整数的值大于该整数可以保留的值,则返回整数的最小值

这不是规则。有关规则如下:

对于
未选中的
上下文中的整数类型(即默认值):

如果源类型大于目标类型,则源值将被截断 丢弃其“额外”最高有效位。然后将结果视为目标的值 类型

对于
未选中的
上下文中的float->int:

该值向零四舍五入至最接近的整数值。如果该整数值在 目标类型的范围,则此值是转换的结果。 否则,转换的结果是目标类型的未指定值

切断off的32个前导位
0x7fffffffffffffff
得到
0xffffffff
aka-1

你从来没有得到过保证,你会得到
int.MinValue
的超范围浮点->int cast,但你还是这样做了,因为它很容易实现:x64的转换指令生成0x8000000的超范围结果,类似地(32位JIT使用的旧x87转换指令)存储“整数不定值”也就是0x8000000。

让我解释一下:

long longValue=long.MaxValue;
float floatValue = float.MaxValue;
int integerValue = (int) longValue;
int integerValue2 = (int)floatValue;
long的最大值为9223372036854775807或0x7FFFFFFFFFFFFFFFFF,因此2的补码在减少为0xFFFFFFFF后将返回0x00000001,带负号位,以十进制表示为-1

另一方面,float的最大值是3.40282347E+38,因此将其转换为int,将值四舍五入为3E+38,并使用2的补码将其减少后,我们得到十六进制值0x8000000,带负号位,十进制为-2147483648

所有这些情况都适用于有符号整数,结果将不同于无符号整数

参考:


我在想另一个办法
inti=(int)long.MaxValue
0xFFFFFFFF
填充
i
,这是
-1
,所以我很清楚。我想知道为什么
int I=(int)float.MaxValue
最后出现在
int.MinValue
中,它是
0x8000000
。在十进制中它应该是“4294967295”,但因为到达这个数值时,Int32的最大值是2147483647,所以它从-2147483648(它的最小值)开始计数然后确实达到-1。@PaulWeiland No。如果
无符号
,则值将为
4294967295
。但是由于
int
有符号的
,32个一的序列在2的补码中等于
-1
。您关于从float转换为int的论点是不正确的。您的陈述“3.40282347E+38,因此将其转换为int将值四舍五入为3E+38”仅在纸上和笔上是正确的,不是在计算机中,而是在内部表示。。。在十六进制中,64位长.Maxvalue到32位int的中继是0xFFFFFF,它在2的补码上的有符号整数表示中是-1。按位表示为0x7FFFFF的float.maxvalue依次按位等于2的补码表示形式上的Integer.maxvalue。@JoãOreblo具有位模式0x7FFFFFFF的float是NaN,内部表示形式对float根本不重要->int castI不明白为什么这个答案被标记为已接受!它既不准确也不清楚。我认为@harlod的答案,到目前为止投了13票,应该被标记为已接受,而不是这一点:
中的第三句话:
当您从双精度或浮点值转换为整数类型时,该值会被截断[即,截断为最接近的可能值]。如果生成的整数值超出目标值的范围,则结果取决于溢出检查上下文。
这就是为什么显式数值强制转换以静默方式执行从Single.MinValue到Int32.MinValue的转换,而不抛出
OverflowException
。在基于十六进制格式的C#casting工作中?0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF?我的意思是,例如,从一种类型转换为另一种类型,如果我将它的值转换为二进制,以检查其他类型的位数,那么决定我是否可以保留或丢失data@Tuncaf幕后没有格式。十六进制和二进制只是两种同样好的可视化方式(但十六进制更短,这是我选择它的唯一原因)。