我已将p指向整数n。在读取值时,我将其类型转换为char,这表示编译器他只需要读取1个字节的数据。系统为整数分配4个字节,为char分配1个字节。345 = 00000000 00000000 00000001 01011001因此,编译器读取最后一个字节01011001 = 89。我只是想知道,是否所有编译器都从LSB开始读取?我想知道我们是否可以得到MSB = 0的输出;
void main()
{
unsigned int n=345;
char c = 't';
void *p = &n;
printf("%d",*((char *)p));
}
Output :
89
是,大端架构将打印0
而不是89
。您可以在这里看到它:https://godbolt.org/z/pLHMDd-PowerPC是大端存储,结果为零。
问题
编译器仅用于将源代码转换为机器代码,而后者又称为可执行文件。
我想知道我们能否获得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;
}
运行此演示应用程序将产生以下结果: