Во-первых, 0 - это абсолютно правильное «значение мусора».
Но это спорный вопрос, потому что вы на самом деле не конвертируете 4 байта в целое число & mdash; Вы извлекаете один байт, а затем конвертируете его в целое число. Вам придется переосмыслить char*
как int*
(затем разыменовать его), чтобы сделать то, что вы говорите, что делаете, и тогда мы придем к:
Неопределенное поведение
Манипулирующая память, подобная этой, имеет неопределенное поведение . Все может произойти, если вы попытаетесь сделать вид, что не int
является int
.
Это не просто стандарт или пуританство, или педантизм. Это правда и имеет реальные практические результаты, такие как тот, который вы видели.
Процесс перевода абстрактной программы, которую вы описали с использованием слов C ++, в реальную практическую программу, понятную компьютеру, невероятно сложен . Компилятор не берет ваши строки по одной и просто наивно переписывает их в код, который одинаков, но на машинном языке. Он читает весь ваш исходный код, понимает, что вы хотите, чтобы программа, которую он описывает для вас, затем создает совершенно новую программу на совершенно другом, не связанном, отдельном языке, который дает тот же результат. Чтобы сделать это быстро, нужно также несколько ярлыков.
Когда вы пишете программу, поведение которой не определено, вы нарушаете этот процесс. Вы просто не можете предположить, что «мы должны получить целочисленное значение, равное 3 последним байтам первого байта [i] + a [1]». Вероятно, это было более вероятно в 70-е годы, но компьютеры действительно сложные, современные, а не старинные.
Короткая версия: не делайте этого.