Краткий ответ на все эти вопросы таков (по крайней мере, переносимым способом, который действительно определяется самим C), вы не можете.
Например, адресные строки являются особенно жесткими. Например, у DSP есть два или даже три совершенно отдельных адресных пространства, подключенных к одинаковому количеству каналов физической памяти, и каждый из них может иметь уникальный размер. Вместе с тем, даже если на процессоре имеется N адресных линий, памяти может (и часто будет) меньше, чем фактически подключено.
Тем не менее, sizeof(void *) * CHAR_BIT
обычно дает, по крайней мере, разумное приближение количества адресных строк - по крайней мере, количество, теоретически допустимое архитектурой, хотя объем адресуемой памяти вполне может отличаться.
Стандарт гласит, что int
должен быть "натуральным размером, предложенным процессором". Чаще всего (но определенно не всегда) это соответствует размеру целочисленных регистров процессоров.