c# - C# 中的一些奇怪的东西 - UInt32 与 Int32

标签 c# unsigned signed

背景

我使用 C# 工作,通常为嵌入式项目编写支持程序。我从一个早已离去的人那里继承了一个项目,这是我的一位客户用来通过 RS-232 下载和上传 Intel Hex 文件到他们的一些主板的程序。该程序多年来对他们来说运行良好,但对于我正在开发的新板,它却没有运行,需要进行一些修改。

问题

我打开项目,发现了问题。新板在 0x90000000-0x9007FFFF 范围内的地址生成一些数据,C# 代码使用 int 类型作为地址数据;已签名,错误地处理了 0x80000000 上的地址。到目前为止,一切都很好。但后来我变得自大了。

我决定清理代码,根据用途将所有“int”替换为 Int16/UInt16/Int32/UInt32。这花了一段时间,但我认为这会使代码更清晰易懂,并希望避免任何 future 的错误。

代码停止工作。我花了一天的大部分时间,归结为这一行:

currseg = (HexSegment)hex_segments[HashEntry];

HexSegment 类型是一个结构体(是的,结构体,不是类),

public struct HexSegment
{
    UInt32 Address; // this is the fix I made, both were int
    UInt32 Buf_idx;
}

hex_segments 是一个哈希表。

最后,HashEntry 是一个“int”,也变成了 UInt32

在调试器中我看到了这个:

enter image description here

如果看不到图片,HashEntry的值为0x00000000。 如果我要求调试器查看 hex_segments[0],我会得到一个包含合法数据的 MLV.HexSegment。 如果我要求调试器查看 hex_segments[HashEntry],我会得到 null!!

HashEntry 更改为 Int32 解决了这个问题。

正如我所说,我是一名嵌入式程序员。对我来说,这是一个很大的谜团。有谁能解释一下为什么会这样吗?

最佳答案

因为 Hashtable 是由对象而不是 int 索引的。

public virtual object this[object key] { get; set; }

因此,如果一个对象添加了键 0 作为 Int32,它将不同于添加了 0 作为 UInt32 的对象。

看看这个:

UInt32 index = 0;
Int32 index2 = 0;
Hashtable t = new Hashtable();

t.Add(index, new { name = "matt" });
t.Add(index2, new { name = "Matt" });

var obj = t[index];
var obj2 = t[index2];

Console.WriteLine(obj);
Console.WriteLine(obj2);

关于c# - C# 中的一些奇怪的东西 - UInt32 与 Int32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54770024/

相关文章:

c# - 使用 IProgress.Report() 报告进度时,控制台消息的显示顺序不正确

c# - Entity Framework 7 和 BindingList

c# - 将 Angular FormData 中的 int 列表发送到 C# 中的 POST Web API

perl - 如何在 Perl 中进行 64 位算术运算?

c# - 通过 GATT (UWP) 向 BLE 设备发送写入请求

Kotlin 使用 UInt 进行数组访问和常量

python - Cython 发出 'unnecessary' 警告

C++ vector 大小。为什么-1大于零

c# - 有没有人有任何代码可以从 C# 调用 SignerSignEx?

c - 不使用 64 位数据类型的 32 位有符号整数乘法