Одна вещь не имеет ничего общего с другой.Одним из них является адрес, указатель на что-то, не имеет значения, является ли это символом или коротким или int или структурой.Другой - это специфическая для языка вещь, называемая int, которую компилятор для этой системы и этой версии компилятора и, возможно, параметров командной строки определяют как некоторый размер.
Похоже, что вы работаете в 64-битной системе, поэтому все ваши указатели / адреса будут 64-битными.То, на что они указывают, - это отдельное обсуждение: длинные, вероятно, тоже будут 64-битными, иногда целыми, шорты, вероятно, все еще 16-битными, но не жестким / быстрым правилом и, как мы надеемся, 8-битными, но также не жестким / быстрым правилом.
Где это может быть еще хуже - это кросс-компиляция, при использовании llvm-gcc, до того, как clang был таким же твердым, как и сейчас.На 64-битном хосте байт-код генерировался на основе 64-битного хоста, поэтому 64-битные целые, 64-битные указатели и т. Д. Затем, когда вы выполняли бэкэнд для цели arm, он должен был использовать вызовы библиотеки компилятора для всего этого64 битная работа.Переменные вряд ли должны были быть шортами намного меньше целых, но были целыми.ключ -m32 был сломан, вы все равно получили 64-битные целые числа, поскольку хост не является конечной целью.Непосредственно у gcc такой проблемы нет, и в настоящее время у clang + llvm такой проблемы тоже нет.
Краткий ответ: язык определяет некоторые типы данных char, short, int, long и т. д., и эти типы данных имеютРеализация компилятора определенного размера.и адрес - это просто другой тип данных, определенный реализацией.это все равно что спросить, почему короткое число не такое же количество байтов, как длинное?Поскольку это разные типы данных, один короткий, другой длинный.Один - это адрес, другой - переменная, две разные вещи.