gpt4 book ai didi

C# DWORD 和 QWORD - 有符号和无符号的疯狂

转载 作者:太空狗 更新时间:2023-10-30 01:03:05 25 4
gpt4 key购买 nike

我注意到 DWordQWord 值在写入注册表时应该是有符号整数,而不是无符号整数。如果值为 UInt64 或 UInt32,此代码将抛出异常:

registryKey.SetValue(name, value);

根据 MSDN DWORD 是一个 32 位无符号整数(范围:0 到 4294967295 十进制)https://msdn.microsoft.com/en-us/library/cc230318.aspx

因此,要将新的 DWORD 值写入注册表,我需要将其转换为有符号整数,如下所示:

UInt32 unsignedValue = (UInt32)someValue;
Int32 signedValue = (Int32)unsignedValue;
registryKey.SetValue(name, signedValue);

将无符号值传递给SetValue 方法将抛出异常。我是不是遗漏了什么,或者我只是智障?

最佳答案

对于 historical reasons , .NET API/库通常是“签名”而不是“签名+未签名”。

但归根结底,signed intunsigned int都占用相同的内存空间,负值也没有做特殊处理。所以你可以按照你说的去做:将无符号值转换为有符号,用 SetValue 写入,然后如果你查看 Regedit 中的值,你会发现它是写成“无符号”。

请注意,如果您的程序是在“已检查”模式下编译的,则更正确的代码将是:

uint unsignedValue = ... // Your original value

int signedValue = unchecked((int)unsignedValue);
registryKey.SetValue(name, signedValue);

因为在“已检查”模式下,如果无法进行转换,则 intuint 之间的转换会引发异常。

注意写成here :

This overload of SetValue stores 64-bit integers as strings (RegistryValueKind.String). To store 64-bit numbers as RegistryValueKind.QWord values, use the SetValue(String, Object, RegistryValueKind) overload that specifies RegistryValueKind.

很明显,您必须对有符号-无符号进行相同的处理。

关于C# DWORD 和 QWORD - 有符号和无符号的疯狂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30727777/

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