検索した後、UInt32はC#のDWORDと同等のものだと聞きました。 IはC++に相当するC++ DWORDは何ですか?
*(DWORD*)(1 + 0x2C) //C++
(UInt32)(1 + 0x2C) //C#
彼らは完全に異なる結果を生成する演算を実行することによって、結果を試験しました。誰かが私にC#のDWORDの正しいマッチを教えてもらえますか?
検索した後、UInt32はC#のDWORDと同等のものだと聞きました。 IはC++に相当するC++ DWORDは何ですか?
*(DWORD*)(1 + 0x2C) //C++
(UInt32)(1 + 0x2C) //C#
彼らは完全に異なる結果を生成する演算を実行することによって、結果を試験しました。誰かが私にC#のDWORDの正しいマッチを教えてもらえますか?
あなたの例では、DWORDをポインタとして使用しています。これはおそらく無効なポインタです。私はあなた自身がDWORDを意味すると仮定しています。
DWORDはunsigned longと定義され、32ビットの符号なし整数になります。
uint(System.UInt32)は一致する必要があります。
#import <stdio.h>
// I'm on macOS right now, so I'm defining DWORD
// the way that Win32 defines it.
typedef unsigned long DWORD;
int main() {
DWORD d = (DWORD)(1 + 0x2C);
int i = (int)d;
printf("value: %d\n", i);
return 0;
}
出力:45
public class Program
{
public static void Main()
{
uint d = (uint)(1 + 0x2C);
System.Console.WriteLine("Value: {0}", d);
}
}
出力:マイクロソフトから45
'System.UInt32'は64ビットの符号なし整数ですか?それが本当なら、それはかなり不幸な名前です。 –
@BenjaminLindleyいいえ、タイプミスです。申し訳ありません –
あなたの2つのスニペットは全く異なるものです。あなたのC++コードでは、いくつかの奇妙な理由から、(1 + 0x2C)
(奇妙な方法で45を書く)をDWORD*
に変換し、そのアドレスが実際に有効なメモリ位置であるかのように逆参照します。 C#では、単純に整数型の間で変換しています。
ありがとうございました! – Newbie
DWORD値の定義:
unsigned long型DWORDのtypedef、* PDWORD、* LPDWORD。 https://msdn.microsoft.com/en-us/library/cc230318.aspx
マイクロソフトからUint32の定義
のtypedef unsigned int型UINT32。 https://msdn.microsoft.com/en-us/library/cc230386.aspx
は今、あなたは違いを見ることができます.... 1はunsigned long型であり、他はint型、符号なしです
リンク先のページはC++タイプのUINT32で、C#タイプのUInt32ではありません。 –
はい。しかし、マイクロソフトは、地面レベルの定義を正しく維持します – Naidu
C#には 'unsigned int'または' unsigned long'という名前の型がありません。彼らは 'uint'と' ulong'を持っていますが、C++の 'unsigned int'と' unsigned long'とははっきりと違うことを意味します。具体的には、C#の型は標準で指定されたビットサイズを持ちますが、C++の型はプラットフォームによって異なる場合があり、Microsoftのコンパイラでは 'unsigned int'と' unsigned long'は同じサイズです。 –
彼らは間違いなく、算術側から完全に異なる結果を生成しませんが、私はあなたが誤解していると思いますC++コード...また、C++にはDWORDの概念がありません.Windowsの定義を混在させているでしょう。 –