Разбираясь в устройстве памяти, наткнулся на один момент касательно разрядности системы, насколько я понял в 32-разрядных системах под переменную, например, типа int отводится 32 бита, в результате выделяется 4 ячейки памяти под переменную (по 8 бит каждая), где частями хранится двоичный код значения переменной, переменная типа long int нуждается в 8ми байтах памяти, двоичный код такой переменной должен состоять из 64х бит, правильно ли я понимаю, что под разрядностью системы подразумевается кол-во бит отводящихся на переменную если так, то как long int помещается в 32- разрядных системах? И последний вопрос, почему 32-разрядная система не может использовать оперативную память больше 4х гигабайт ?
Под разрядностью системы обычно понимается разрядность памяти (разрядность адреса памяти) плюс также разрядность АЛУ (арифметическо-логическое устройство).
В 32-битной системе можно адресовать 32-битным адресом любой байт памяти, это означает что максимум может быть в системе 4ГигаБайт (т.е. 2^32 = 4Гига, около 10^9), в 64-разрядной можно адресовать 16 ЭкзаБайт (т.к. 2^64 = 16Экза, около 10^19). Адрес в С++ задаётся указателем, в 32-битной системе указатель будет 4-байтный, в 64-битной указатель 8-байтный.
По поводу АЛУ. 32-битное АЛУ означает что максимальный размер машинного слова АЛУ равен 32 битам, т.е. это максимальное целое число с которым возможны целочисленные операции такие как сложение, вычитание, умножение (результат умножения обычно доступен в два раза больший разрядности АЛУ) и деление (делимое обычно допускается в два раза большей разрядности чем АЛУ). У 64-битного АЛУ разрядность машинного слова 64 бита, т.е. процессор оперирует максимум 64 битными целыми числами.
Поясняю ваш вопрос про типы - размер типов не зависит от разрядности ни памяти ни АЛУ. Размер типов определяется только самим типом, а также операционной системой и компилятором. Обычно char - 8-битный, short - 16-битный, int - 32-битный, long long - 64-битный. Т.е. эти типы могут хранить указанное максимальное число бит внутри себя и в памяти они будут занимать ровно указанное число бит. А вот как компилятор в машинный код операции с этими типами скомпилирует, это уже зависит от размера АЛУ у процессора. Если АЛУ 32-битный то 64-битные типы (например long long) они будут эмулироваться с помощью 32-битных операци, т.е. будут занимать несколько инструкций, каждая 32-битная половинка слова будет отдельно складываться учитывая перенос между словами. Операции с типами меньшей чем АЛУ разрядности отлично исполняются в одну операцию, т.к. у 32-разрядной АЛУ родные операции 8, 16, 32 битные.
На самом деле в 32-битной системе можно получить доступ к более чем 4Гб памяти, но только с помощью специальных дополнительных обращений к системным вызовам оперционной системы (Доступ к более чем 4Гб в 32-битной системе). Стандартными С/С++ методами получить сплошной доступ сразу ко всей памяти больше 4Гб нельзя, т.к. в С/С++ указатели 32-битные для 32-битных систем. Чтобы получить доступ к расширенной памяти нужно будет использовать сочетание двух указателей - указатель на отдельный участок в 4Гб плюс указатель внутри этого участка, и этот доступ требует ОС вызовов.
Размер переменных определяется реализацией (по стандарту), то есть под long могут отдавать как 64 бита, так и те же 32. Если в общем, то:
sizeof(short)<=sizeof(int)<=sizeof(long)
А 32 битная система просто не видит память более 4Гб, ведь у каждого байта памяти есть свой адрес. Переведём 4Гб в байты: 4*1024*1024*1024=2^32. Думаю, связь очевидна.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости