Разрядность системы

431
20 сентября 2017, 12:34

Разбираясь в устройстве памяти, наткнулся на один момент касательно разрядности системы, насколько я понял в 32-разрядных системах под переменную, например, типа int отводится 32 бита, в результате выделяется 4 ячейки памяти под переменную (по 8 бит каждая), где частями хранится двоичный код значения переменной, переменная типа long int нуждается в 8ми байтах памяти, двоичный код такой переменной должен состоять из 64х бит, правильно ли я понимаю, что под разрядностью системы подразумевается кол-во бит отводящихся на переменную если так, то как long int помещается в 32- разрядных системах? И последний вопрос, почему 32-разрядная система не может использовать оперативную память больше 4х гигабайт ?

Answer 1

Под разрядностью системы обычно понимается разрядность памяти (разрядность адреса памяти) плюс также разрядность АЛУ (арифметическо-логическое устройство).

В 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Гб плюс указатель внутри этого участка, и этот доступ требует ОС вызовов.

Answer 2

Размер переменных определяется реализацией (по стандарту), то есть под long могут отдавать как 64 бита, так и те же 32. Если в общем, то:

sizeof(short)<=sizeof(int)<=sizeof(long)

А 32 битная система просто не видит память более 4Гб, ведь у каждого байта памяти есть свой адрес. Переведём 4Гб в байты: 4*1024*1024*1024=2^32. Думаю, связь очевидна.

READ ALSO
Как переменную int положить в массив char в С++? [требует правки]

Как переменную int положить в массив char в С++? [требует правки]

Как переменную int положить в массив char в С++

339
Как возобновить поток cin после ctrl+z

Как возобновить поток cin после ctrl+z

Вопрос, если для выхода из цикла нажать ctrl + z, то после этого ни одна команда cin не будет работатьПодскажите, как исправить?

284
Принудительное завершение программы

Принудительное завершение программы

Подскажите, как при выборе второго пункта меню экстренно закончить выполнение программы, пытался зациклить меню, но видимо из-за выполнения...

350
Как использовать другой компилятор в CLion в Linux?

Как использовать другой компилятор в CLion в Linux?

Например, я хочу собрать под Linux'ом exe-шникMinGW для g++ это позволяет сделать(ведь да?)

457