编译器在C程序中读取内存时是如何工作的?以下是我编写的代码:

编译器在C程序中读取内存时是如何工作的?以下是我编写的代码:,c,pointers,unsigned-integer,C,Pointers,Unsigned Integer,我已经把p指向了整数n。在读取值时,我将其键入char,这表示编译器只需读取1字节的数据。系统正在为整数分配4个字节,为字符分配1个字节。 345 = 00000000 00000000 00000001 01011001 所以编译器读取最后一个字节01011001=89。 我只是想知道,如果所有的编译器都从LSB开始读取?我想知道是否可以将输出设为MSB=0 void main() { unsigned int n=345; char c = 't'; void *p = &

我已经把p指向了整数n。在读取值时,我将其键入char,这表示编译器只需读取1字节的数据。系统正在为整数分配4个字节,为字符分配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

是的,big-endian体系结构将打印
0
,而不是
89
。您可以在这里看到:-PowerPC是big-endian,结果为零。

是的,big-endian体系结构将打印
0
,而不是
89
。您可以在这里看到:-PowerPC是big-endian,结果为零。

在C程序中读取内存时,编译器的行为如何

编译器在编译期间用于将源代码转换为机器代码。机器代码(也称为可执行文件或二进制文件)用于在运行时运行程序

我想知道是否可以将输出设为MSB=0

void main()
{
  unsigned int n=345;
  char c = 't';

  void *p = &n;
  printf("%d",*((char *)p)); 

}

Output : 
89
这台机器要么是大端,要么是小端,因此它将使用其本机体系结构处理数据,但如果您想将数据从一个端显示到另一个端,则可以交换字节

以下是对您的代码进行的修改,其中包含一些额外的函数,以演示字节交换和二进制表示:

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;
}
int main(无效)
{
无符号整数n=345;
字符c='t';
无效*p=&n;
printf(“交换前的第一个字节:%d\n”,*((char*)p));
//显示所有位以进行说明
printf(“二进制-交换前的字节:%s\n\n”,字节\u到\u二进制32(n));
//字节交换的演示
printf(“\n交换前数据:%04X”,n);
unsigned int new=swap(n);
printf(“\n交换后的数据:%04X\n”,新建);
//结束演示
printf(“二进制-交换后的字节:%s\n\n”,字节\u到\u二进制32(新));
p=&new;
printf(“交换后的第一个字节:%d\n”,*((char*)p));
返回0;
}
//无符号32位转换
无符号整数交换(无符号整数数据)
{ 
unsigned int new=((数据>>24)&0xff)|//将字节3移动到字节0
((data8)&0xff00)|//将字节2移动到字节1
((数据>=1)//2^32
{
*p++=(x&z)?“1”:“0”;
}
返回b;
}
运行此演示应用程序将产生以下结果:

在C程序中读取内存时,编译器的行为如何

编译时使用编译器将源代码转换为机器代码。机器代码(也称为可执行文件或二进制文件)用于在运行时运行程序

我想知道是否可以将输出设为MSB=0

void main()
{
  unsigned int n=345;
  char c = 't';

  void *p = &n;
  printf("%d",*((char *)p)); 

}

Output : 
89
这台机器要么是大端,要么是小端,因此它将使用其本机体系结构处理数据,但如果您想将数据从一个端显示到另一个端,则可以交换字节

以下是对您的代码进行的修改,其中包含一些额外的函数,以演示字节交换和二进制表示:

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;
}
int main(无效)
{
无符号整数n=345;
字符c='t';
无效*p=&n;
printf(“交换前的第一个字节:%d\n”,*((char*)p));
//显示所有位以进行说明
printf(“二进制-交换前的字节:%s\n\n”,字节\u到\u二进制32(n));
//字节交换的演示
printf(“\n交换前数据:%04X”,n);
unsigned int new=swap(n);
printf(“\n交换后的数据:%04X\n”,新建);
//结束演示
printf(“二进制-交换后的字节:%s\n\n”,字节\u到\u二进制32(新));
p=&new;
printf(“交换后的第一个字节:%d\n”,*((char*)p));
返回0;
}
//无符号32位转换
无符号整数交换(无符号整数数据)
{ 
unsigned int new=((数据>>24)&0xff)|//将字节3移动到字节0
((data8)&0xff00)|//将字节2移动到字节1
((数据>=1)//2^32
{
*p++=(x&z)?“1”:“0”;
}
返回b;
}
运行此演示应用程序将产生以下结果:


我认为你可以用big-endian机器得到0。我认为你可以用big-endian机器得到0。我的错。不熟悉godbolt读数,我误解了我看到的内容。对不起。(一旦你看到,将删除此评论。)我的错。不熟悉godbolt读数,我误解了我看到的内容。对不起。(一旦表明您已经看到,将删除此注释。)