gpt4 book ai didi

c# - C# 中的 C++ 联合,它们在底层是如何工作的?

转载 作者:行者123 更新时间:2023-11-30 17:53:36 25 4
gpt4 key购买 nike

我已经在 C# 中实现了 C++ 联合,只是为了验证我是否理解它。但我似乎什么都不懂。我有时期望得到完全不同的输出。我的代码:

using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication2
{
[StructLayout(LayoutKind.Explicit)]
class union
{
[FieldOffset(0)]
public double d;
[FieldOffset(0)]
public float f0;
[FieldOffset(4)]
public float f1;
[FieldOffset(0)]
public int i0;
[FieldOffset(4)]
public int i1;
[FieldOffset(0)]
public short s0;
[FieldOffset(2)]
public short s1;
[FieldOffset(4)]
public short s2;
[FieldOffset(6)]
public short s3;

}

class Program
{
static void Main(string[] args)
{
union su = new union();
su.f0 = 19.012012F;
su.f1 = 3.14159265F;
Console.WriteLine(su.d);
Console.WriteLine(su.i0);
Console.WriteLine(su.i1);
Console.WriteLine(su.s0);
Console.WriteLine(su.s1);
Console.WriteLine(su.s2);
Console.WriteLine(su.s3);
Console.ReadLine();
}
}
}

我的输出是:

  • 50,1238786690385
  • 1100486810
  • 1078530011
  • 6298
  • 16792
  • 4059
  • 16457

例如,我认为 s0 应该是 30209 而不是 6298。谁能解释一下它是如何工作的?

最佳答案

愚蠢的我,知道答案,但不会做基本的数学。这真的很简单。在 IEEE 754 中翻译您的 float 。然后检查您的偏移量(以字节为单位),这是您的起点。确保您知道您的类型的长度(以位为单位或以字节为单位)。然后像你以前学过的那样解决你的号码。
例如:
f0 的最后 16 位(小数)是: 0001 1000 (Byte 1) 1001 1010(Byte 0)
s0 是一个短整数,所以它的大小是 16 位或 2 字节。现在开始通过从 LSB 开始解析 s0 为:
2 + 8 + 16 + 128 + 2048 + 4096 = 6298

所以这里没什么特别的。
对于给您带来的不便,我深表歉意。

关于c# - C# 中的 C++ 联合,它们在底层是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17154843/

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