[英]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
值寫入Registry,我需要將其轉換為有符號整數,如下所示:
UInt32 unsignedValue = (UInt32)someValue;
Int32 signedValue = (Int32)unsignedValue;
registryKey.SetValue(name, signedValue);
將無符號值傳遞給SetValue方法將引發異常。 我錯過了什么,或者我只是被弱智?
由於歷史原因 ,.NET API /庫通常是“已簽名”而不是“已簽名+未簽名”。
但最后, signed int
和unsigned int
都占用相同的內存空間,並且沒有對負值進行特殊處理。 所以你可以按照你說的做:將無符號值轉換為signed,用SetValue
寫,然后如果你看Regedit
中的值,你會看到它被寫成“unsigned”。
請注意,如果您的程序是在“已檢查”模式下編譯的,則更正確的代碼是:
uint unsignedValue = ... // Your original value
int signedValue = unchecked((int)unsignedValue);
registryKey.SetValue(name, signedValue);
因為在“已檢查”模式下,如果無法進行轉換,則int
和uint
之間的轉換會拋出異常。
注意,寫在這里 :
SetValue的這個重載將64位整數存儲為字符串(RegistryValueKind.String)。 要將64位數字存儲為RegistryValueKind.QWord值,請使用指定RegistryValueKind的SetValue(String,Object,RegistryValueKind)重載。
顯然,你必須對signed-unsigned做同樣的處理。
從RegistryKey.SetValue頁面'示例:
// Numeric values that cannot be interpreted as DWord (int) values
// are stored as strings.
似乎存儲的值是簽名的int或字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.