C#DWORD和QWORD - 签名和未签名的疯狂

时间:2015-06-09 09:13:05

标签: c# registry dword

我注意到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 方法将引发异常。 我错过了什么,或者我只是被弱智?

2 个答案:

答案 0 :(得分:3)

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

但最后,signed intunsigned int都占用相同的内存空间,并且没有对负值进行特殊处理。所以你可以按照你的说法做:将无符号值转换为signed,用SetValue编写,然后如果你查看Regedit中的值,你就会看到它被写成“unsigned”。 / p>

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

uint unsignedValue = ... // Your original value

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

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

请注意,如here所示:

  

SetValue的这个重载将64位整数存储为字符串(RegistryValueKind.String)。要将64位数字存储为RegistryValueKind.QWord值,请使用指定RegistryValueKind的SetValue(String,Object,RegistryValueKind)重载。

显然,您必须对signed-unsigned进行相同的处理。

答案 1 :(得分:1)

RegistryKey.SetValue页面'示例:

// Numeric values that cannot be interpreted as DWord (int) values
// are stored as strings.

似乎存储的值是有符号的整数或字符串。