Одна из проблем заключается в том, что вы поразрядно присваиваете значения OR в байтах вашего int, но вы не обнулили его первым - это значит, что вы получаете комбинацию ORed значений, которые вы намеренно включаете, и всебыл (случайно) уже там.Поэтому измените это:
*p_a |= (50 << 24);
*p_a |= (100 << 16);
*p_a |= (150 << 8);
*p_a |= 200;
... на это:
*p_a = (50 << 24) | (100 << 16) | (150 << 8) | 200;
... или просто установите *p_a
на ноль вначале.
Однако вашКод также предполагает систему с прямым порядком байтов.Если вы используете систему с прямым порядком байтов, такую как x86, вам также необходимо поменять местами значения:
*p_a = 50 | (100 << 8) | (150 << 16) | (200 << 24);
..., чтобы соответствовать тому, что вы делаете с версией ucharArray()
.
@ Кристиан Аммер также прав, что:
if (p_a == p_last)
break;
p_a++;
... должно быть:
p_a++;
if (p_a == p_last)
break;
... так, чтобы тест проходилпосле приращения.(в двух местах в вашей версии int)