【问题标题】:showing memory addresses with Console.Writeline用 Console.Writeline 显示内存地址
【发布时间】:2022-07-27 21:13:04
【问题描述】:

我在 C# 控制台应用程序中有此代码:

int x = 10;
int* ptr1 = &x;
Console.WriteLine((int)ptr1);
Console.WriteLine((long)ptr1);
Console.WriteLine((ulong)ptr1);

为什么我会得到 int 数据类型的不同值?是因为 int 的 2,147,483,647 限制吗?

-1529354580
453737178796
453737178796

【问题讨论】:

    标签: c# reference console.writeline


    【解决方案1】:

    我假设您为 x64 架构构建。 x64 中的地址大小为 64 位(8 字节)。 对于int 类型的数据,指针包含一个地址。 此地址无法放入int,因为它的大小只有 32 位(4 字节)。

    值被截断,使用时看到的就是这个:

    Console.WriteLine((int)ptr1);
    

    截断是指编译器将占用地址的 4 个字节,并将它们存储在 32 位存储 (int) 中。你会丢失 4 个字节,如果值超过 int 的最大值,结果将毫无意义。

    另外 2 行打印:

    Console.WriteLine((long)ptr1);
    Console.WriteLine((ulong)ptr1);
    

    将指针转换为 64 位类型(longulong),因此您可以获得整个地址。

    原则上,longulong 也可以有不同的输出。但是由于地址总是正数并且通常在long 的有效范围内,所以您没有遇到这个问题。

    顺便说一句 - 如果您要为 x86(32 位架构)构建,指针将具有 4 个字节的大小,因此您的所有打印行都将打印相同的值。

    【讨论】:

    • 我怀疑但对理解“值被截断”部分更感兴趣! Showld´t 我得到一个错误而不是那个?
    • 不,因为使用对(int) 的强制转换实际上告诉编译器你知道这个问题。
    • 在上面的答案正文中添加了更多关于截断的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 2011-09-19
    • 2013-06-26
    相关资源
    最近更新 更多