当前位置:  开发笔记 > 编程语言 > 正文

如何重新解释将float转换为int?是否有非静态转换运算符或用户定义的赋值运算符用于'this'的转换?

如何解决《如何重新解释将float转换为int?是否有非静态转换运算符或用户定义的赋值运算符用于'this'的转换?》经验,为你挑选了3个好方法。

1.如何重新解释将浮点数转换为int(或double到long)?

float f = 2.0f;
int i = (int)f; // causes conversion

我只想将位模式复制fi.如何才能做到这一点?

2. C#中的隐式和显式运算符使用一个中间对象,因为运算符函数是静态的

public static implicit operator MyClass(double s)
{
    return new MyClass(s);
} 
..
..
MyClass m = 2.2; // this code uses 'm' and one intermediate object.

这适用于引用类型,但对于较大的值类型(例如20-30字节),这将导致不必要的数据复制.我的理解是否正确?如果是,那么为什么C#不具有非静态转换运算符或用户定义的赋值运算符,以便转换/赋值发生在'this'上?如果确实如此,那该怎么做呢?



1> Marc Gravell..:

1:BitConverter(作为sixlettervararia)是一个选项; 因为不安全的代码(不需要中间缓冲区):

    float f = 2.0f;
    int i;
    // perform unsafe cast (preserving raw binary)
    unsafe
    {
        float* fRef = &f;
        i = *((int*)fRef);
    }
    Console.WriteLine(i);

    // prove same answer long-hand
    byte[] raw = BitConverter.GetBytes(f);
    int j = BitConverter.ToInt32(raw, 0);        
    Console.WriteLine(j);

2:请注意,您应该限制结构的大小.我找不到引用它,但数字"16字节"(最大,作为推荐)似乎坚持我的想法.在此之上,考虑一个不可变的引用类型(类).



2> Ani..:

禁止使用不安全的代码 - 这是我所知道的执行重新解释的最快方法:

    [StructLayout(LayoutKind.Explicit)]
    private struct IntFloat
    {
        [FieldOffset(0)]
        public int IntValue;
        [FieldOffset(0)]
        public float FloatValue;
    }
    private static float Foo(float x)
    {
        var intFloat = new IntFloat { FloatValue = x };
        var floatAsInt = intFloat.IntValue;
        ...

希望这有助于某人.



3> user7116..:

    该BitConverter类可以检索任何原始类型,然后你就可以用它来创建一个int的字节数.如果您要进行大量转换,则另一个选项是Buffer.BlockCopy.

    float ff = 2.0f;
    int ii = BitConverter.ToInt32(BitConverter.GetBytes(ff), 0);
    
    float[] ff = new float[...];
    int[] ii = new int[ff.Length];
    Buffer.BlockCopy(ff, 0, ii, 0, ff.Length * 4); // byte-wise copy of ff into ii
    

    没有在C#中没有给出其他选项,但是,我认为虽然你的副本是正确的,但是任何足够简单的实现都会完成JIT优化,可能无需复制.

推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有