The output is aaaaaaaa (eight a:s) if the size of int is four bytes and int:s are stored using two's complement. In the numbers -1 and -3, all bytes are non-zero, so eight a:s are printed. In the number 256, the least significant (and the most significant) byte is zero so this halts the while loop.
If you print the array byte per byte with
#include <stdio.h>
int main(void)
{
int data[5] = {-1, -3, 256, -4, 0}, i;
const char *p;
p = (char *) data;
for (i = 0; i < sizeof (data); i++) {
printf(" %d", p[i]);
}
printf("\n");
return 0;
}
you get
-1 -1 -1 -1 -3 -1 -1 -1 0 1 0 0 -4 -1 -1 -1 0 0 0 0
Here you can see that the ninth number is zero.