Может кто-нибудь объяснить мне, как это работает - PullRequest
0 голосов
/ 14 июня 2019

я видел этот вопрос на моем выпускном экзамене по языку c, результат 513, и я не знаю, почему

#include <stdio.h>
int main(void){
    char a[4] = {1,2,3,4};
    print("%d" , *(short*)a);
}

Ответы [ 3 ]

7 голосов
/ 14 июня 2019

Ваш массив байтов (в шестнадцатеричном формате):

[ 0x01, 0x02, 0x03, 0x04 ]

Если вы рассматриваете начало массива не как массив байтов, а как начало short, тогда ваш короткийимеет значение 0x01 0x02, и поскольку ваш процессор "Little Endian" , он читает в обратном порядке, как люди его читают.Мы бы это как 0x0201, что совпадает с 513(Decimal)

4 голосов
/ 14 июня 2019

Если система, на которой выполняется этот код, удовлетворяет следующим требованиям:

  • Разрешен доступ к не выровненной памяти (или a гарантированно будет short -настроенным)

  • Используется порядок байтов в младшем порядке

  • sizeof(short) == 2

  • CHAR_BIT == 8

Затем разыменование указателя short * на следующую память:

|  0x01  |  0x02  |  0x03  |  0x04  |

даст вам 0x0201 или 513 в базе 10.

Кроме того, обратите внимание, что даже если все эти требования выполнены, наложение массива char [] на short * нарушает правило строгого наложения .

1 голос
/ 14 июня 2019

Код переводит ваш char* указатель в short* единицу и печатает его значение.

short в C представлен в 2 байта, и двоичное представление первых двух байтов вашего массива равно 00000001 00000010, но поскольку процессор имеет младший порядок, он читает его как 00000010 00000001, что равно 513в десятичном.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...