2012-06-02 3 views
1

Почему и оператор действует по-разному при использовании:C# и «&» оператор используется с указателем литья

  1. с ООН неподписанных Int
  2. с байтовый массив represiting такое же значение, когда отливают к (UINT *)

    unsafe 
    { 
        fixed (byte* i = new byte[4] { 0x02, 0x03, 0x04, 0xFF }) 
        { 
         uint m = 0x020304FF; 
    
         Console.WriteLine("{0:X}",m & 0xFF000000); 
    
         Console.WriteLine("{0:X}",*(uint*)i & 0xFF000000); 
        } 
    } 
    

результат

 2000000 
    ff000000 
+0

Примечание: вся 'Console.WriteLine (Convert.ToString (foo, 16))' может быть сокращена до 'Console.WriteLine (" {0: x} ", foo)'. Класс 'Convert' довольно бесполезен вообще. –

+0

Эти досадные маленькие концы кружатся вокруг вас (извините :) – Alan

ответ

2

Предполагая, что 32 бит little-endian system (как и любой процессор Intel, на подавляющем большинстве современных компьютеров), отбрасывание адреса байтового массива {02 03 04 FF} по адресу 32-битного int приведет к int со значением 0xFF040302. Отсюда и результат.

Другими словами, ваше предположение о том, что это «то же значение», неверно.

+0

не должно быть то же самое с uint m = 0x020304FF? –

+0

@ anouar204 Нет, если вы должны были проверить внутреннюю память uint m, вы обнаружите, что это байты 'FF 04 03 02' в этом порядке. Опять же, предполагая систему little-endian (т. Е. Любой процессор Intel) –

+0

Хорошо, это означает: потому что {0x02, 0x03, 0x04, 0xFF} сохраняется, так как он в памяти воспроизводит int со значением FF040302 –

Смежные вопросы