Когда вы объявляете переменную x типа int в C или C++, я понимаю, что это займет 4 байта памяти. Поэтому для этой переменной выделяются 4 адреса памяти. Мой вопрос: могу ли я увидеть, что все четыре адреса памяти выделяют эту переменную? Я знаю, что это не типичный вопрос, но мне любопытно. Или это на 100% всегда только адрес памяти & x и 3 следующих бита? Итак, если это был адрес памяти 1000, следующий будет 1001, 1002 и 1003? От этого ли это отклоняется?
Также скажем, что я устанавливаю x = 5;
Означает ли это, что в этом месте памяти от 1000 до 1002 оно заполняется нулями, а в 1003 - 101 (двоичное представление 5) в крайнем правом положении?
спасибо
int
может быть четыре байта, хотя это действительно зависит от компилятора. Следовательно, существуют типы определенного размера, такие как uint32_t
. Но позвольте сказать, ради аргумента, что ваш int
равен четырем байтам.
Да, четыре байта являются последовательными. Поэтому вы правы, что &x
и следующие три байта - это местоположение вашей переменной.
Однако ваше предположение о том, что самый правый байт является наименее значимым, справедливо только для машин большого числа. В архитектуре little-endian (например, x86) самые левые байты будут содержать 101
чтобы представить число 5.
Размер int не всегда равен 4 байтам, известно только то, что
char <= short <= int <= long <= long long
Вы можете пройти каждый байт int, как это
#include <stdio.h>
void main() {
int A = 10;
int *intPtr;
char *charPtr;
size_t size = sizeof(int);
size_t i;
intPtr = &A;
printf("%d\n", *intPtr);
charPtr = (char*) intPtr;
for (i = 0; i < size; i++) {
printf("%d\n", *(charPtr++));
}
}
Несколько неточностей:
Размер int
зависит от платформы (хотя в большинстве случаев это действительно 4 байта).
Что вы подразумеваете под "см. Адрес"? Если вы хотите наблюдать это через отладчик, тогда просто продолжайте, и вы, скорее всего, увидите и соседние адреса. Если вы хотите получить доступ к определенному адресу внутри переменной int
, вы можете легко сделать это с помощью указателя char
:
int x = 5;
char* p = (char*)&x;
Вы можете использовать p[i]
для доступа к любому адресу в диапазоне 0<=i<=sizeof(int)-1
.
Содержимое адресов 1000 -1 003 зависит от конечной цели базовой архитектуры HW:
int
гарантированно будет смежной, хотя это не обязательно 4 байта. Другой вопрос зависит от порядка вашей системы.