[编译器在读取C程序中的内存时如何表现?这是我写的要理解的以下代码:

问题描述 投票:1回答:2

我已将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
c pointers unsigned-integer
2个回答
2
投票

是,大端架构将打印0而不是89。您可以在这里看到它:https://godbolt.org/z/pLHMDd-PowerPC是大端存储,结果为零。


1
投票

问题

编译器仅用于将源代码转换为机器代码,而后者又称为可执行文件。

我想知道我们能否获得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;
}

运行此演示应用程序将产生以下结果:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.