Я предполагаю, что вы используете C/C++
&num
берет адрес в память целого числа num
.
- Он интерпретирует этот адрес как указатель на
char
броском (char *)
- Далее, значение этого указателя на полукокса считается первым в
*(char *)&num
звездочкой, и по сравнению с 1.
Теперь int
- 4 байта. Это будет 00 00 00 01
по системе большого конца и 01 00 00 00
на маленькой системе. Символ имеет только один байт, поэтому значение литого в char будет принимать первый байт памяти, занятой num
. Таким образом, на большой системе endian это будет **00** 00 00 01
, а на маленькой системе - это **01** 00 00 00
. Итак, теперь вы выполняете сравнение с помощью инструкции if, чтобы узнать, соответствует ли int, отлитый от char, порядку байтов, используемому в маленькой системе.
На 32-битной системе X86 это может составить до следующей сборки
mov [esp+20h+var_4], 1 ; Moves the value of 1 to a memory address
lea eax, [esp+20h+var_4] ; Loads that memory address to eax register
mov al, [eax] ; Takes the first byte of the value pointed to by the eax register and move that to register al (al is 1 byte)
cmp al, 1 ; compares that one byte of register al to the value of 1
Мне нравится ваш ответ, и теперь я понимаю, но у меня есть еще один вопрос: почему один байт представлен в виде двух нулей в вашем примере? Моя первоначальная мысль заключалась в том, что один байт будет представлен как 8 нулей? – GelatinFox
@ Rouke как легко думать о байте, как в диапазоне от 00 до 0xFF в шестнадцатеричном значении. Когда вы работаете с дизассемблерами, вы видите, что регистры CPU отформатированы в шестнадцатеричном значении, а не в десятичных значениях. Поскольку CPU берет первый байт (приведение в 'char'), значения (' int'), охватывающего 4 байта, в вашем коде, легче представить, что на самом деле происходит таким образом. –
@Rouke 'Моя первоначальная мысль заключалась в том, что один байт будет представлен как 8 нулей. Один байт имеет 8 бит. Поэтому, если вы укажете один байт в двоичном формате, у вас действительно будет 00000000 (восемь) позиций. Каждый 0 может быть 1, поэтому максимальное значение может быть 11111111, которое равно 0xFF в шестнадцатеричном виде и 255 в десятичном значении. Таким образом, 'int num' будет записан ** двоичным ** в 4 блоках по 8 бит, со значением 1 это будет' 00000000 00000000 00000000 00000001'. –