Как компилятор ведет себя при чтении памяти в программе C?
Компилятор используется во время компиляции для преобразования исходного кода в машинный код . Машинный код (исполняемый или двоичный файл AKA) используется для запуска программы во время выполнения.
Мне было интересно, можем ли мы получить вывод как MSB = 0;
Машина либо с прямым порядком байтов, либо с прямым порядком байтов, поэтому она будет обрабатывать данные с использованием своей собственной архитектуры, но если вы хотите представить данные с одного порядка байтов на другой, вы можете поменять байты местами.
Ниже приведена адаптация вашего кода с некоторыми дополнительными функциями для иллюстрации обмена байтами и двоичного представления:
int main(void)
{
unsigned int n=345;
char c = 't';
void *p = &n;
printf("first byte before swap: %d\n",*((char *)p));
//showing all bits for illustration
printf("Binary - bytes before swap : %s\n\n", byte_to_binary32(n));
//demonstration of byte swapping
printf ( "\ndata before swapping : %04X" ,n);
unsigned int new = swap(n);
printf ( "\ndata after swapping : %04X\n" ,new);
// end demo
printf("Binary - bytes after swap: %s\n\n", byte_to_binary32(new));
p = &new;
printf("first byte after swap: %d\n",*((char *)p));
return 0;
}
//unsigned 32 bit conversion
unsigned int swap (unsigned int data)
{
unsigned int new = ((data>>24)&0xff) | // move byte 3 to byte 0
((data<<8)&0xff0000) | // move byte 1 to byte 2
((data>>8)&0xff00) | // move byte 2 to byte 1
((data<<24)&0xff000000); // byte 0 to byte 3;
return new;
}
const char *byte_to_binary32(long x)
{
static char b[33]; // bits plus '\0'
b[0] = '\0';
char *p = b;
//unsigned long long z; required only if 64 bit conversion
unsigned long z;//this is sufficient for 32 bit conversion
for (z = 2147483648; z > 0; z >>= 1) //2^32
{
*p++ = (x & z) ? '1' : '0';
}
return b;
}
Запуск этого демонстрационного приложения даст следующие результаты: