C# DWORD 和 QWORD - 有符号和无符号的疯狂
C# DWORD and QWORD - signed and unsigned madness
我注意到写入注册表的 DWord
和 QWord
值应该是有符号整数,而不是无符号整数。如果值为 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 方法将引发异常。
我是不是遗漏了什么或者我只是智障?
来自 RegistryKey.SetValue 页面的示例:
// Numeric values that cannot be interpreted as DWord (int) values
// are stored as strings.
存储的值似乎是带符号的整数或字符串。
对于 historical reasons,.NET API/libraries 通常是 "signed" 而不是 "signed + unsigned"。
但是最后一个signed int
和一个unsigned int
都占用了相同的内存space,对于负值也没有做特殊处理。所以你可以按照你说的去做:将无符号值转换为有符号,用 SetValue
写入,然后如果你查看 Regedit
中的值,你会看到它被写入 "unsigned" .
请注意,如果您的程序是在 "checked" 模式下编译的,则更正确的代码将是:
uint unsignedValue = ... // Your original value
int signedValue = unchecked((int)unsignedValue);
registryKey.SetValue(name, signedValue);
因为在 "checked" 模式下,如果无法进行转换,int
和 uint
之间的转换会抛出异常。
注意写成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.
很明显,您必须对有符号-无符号进行相同的处理。
我注意到写入注册表的 DWord
和 QWord
值应该是有符号整数,而不是无符号整数。如果值为 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 方法将引发异常。 我是不是遗漏了什么或者我只是智障?
来自 RegistryKey.SetValue 页面的示例:
// Numeric values that cannot be interpreted as DWord (int) values
// are stored as strings.
存储的值似乎是带符号的整数或字符串。
对于 historical reasons,.NET API/libraries 通常是 "signed" 而不是 "signed + unsigned"。
但是最后一个signed int
和一个unsigned int
都占用了相同的内存space,对于负值也没有做特殊处理。所以你可以按照你说的去做:将无符号值转换为有符号,用 SetValue
写入,然后如果你查看 Regedit
中的值,你会看到它被写入 "unsigned" .
请注意,如果您的程序是在 "checked" 模式下编译的,则更正确的代码将是:
uint unsignedValue = ... // Your original value
int signedValue = unchecked((int)unsignedValue);
registryKey.SetValue(name, signedValue);
因为在 "checked" 模式下,如果无法进行转换,int
和 uint
之间的转换会抛出异常。
注意写成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.
很明显,您必须对有符号-无符号进行相同的处理。