Просто я проверял свое понимание указателей, при этом я делал это,
Хорошо, это то, что я думаю. Все указатели на любой тип содержат адреса, верно? Скажи, что я заявляю char *a, b = 'f';
a = &b ;
Поэтому, когда я пытаюсь получить доступ к содержимому b, то есть & b, через указатель на тип char.which, что нормально.
Но, что если я сохраню адрес типа данных int в указателе типа char (хотя я получить предупреждение: присвоение из несовместимого типа указателя [-Wincompatible-pointer-types], я не делаю неправильно, верно? я все еще храню адрес некоторой памяти.)
int main(){
// int type of one byte
int a, i ;
char *b;
for(i = -256 ;i < 257; ++i){
a = i;
b = &a;
printf("for i = %d, value stored in first byte of a = %d\n",i ,*b);
}
return 0;
}
теперь я думал, что будет разрешено читать только первый байт из 4 байтов, выделенных для a , потому что я получаю доступ через указатель на тип символа, я ожидал сохранить значения до 255, за этим будет вид переполнения. но случилось что-то другое, я мог сохранить только 127 до -128, что! !! Вы видели это тип int размером один байт. Вы можете запустить код, чтобы увидеть.
Теперь предположим, что тип int имеет размер один байт
когда a = 256, значение чтения равно 0, что ожидается, поскольку 0001 0000 0000 будет считывать только первый байт. Вывод будет предсказуемым, пока мы не достигнем a = 127, который сохраняется как 0111 1111 (что является положительным значением с точки зрения типа int) когда a = 128, выходное значение равно -128, в котором хранится 1000 0000 (что действительно равно -128) аналогично можно объяснить и другие выводы Таким образом, вывод можно объяснить, предполагая, что тип int имеет размер один байт, почему printf сделал это вместо выдачи ошибки.
Итак, что именно здесь сделал printf? Спасибо, Ваши Превосходительства;)