编译器在C程序中读取内存时是如何工作的?以下是我编写的代码:
我已经把p指向了整数n。在读取值时,我将其键入char,这表示编译器只需读取1字节的数据。系统正在为整数分配4个字节,为字符分配1个字节。 345 = 00000000 00000000 00000001 01011001 所以编译器读取最后一个字节01011001=89。 我只是想知道,如果所有的编译器都从LSB开始读取?我想知道是否可以将输出设为MSB=0编译器在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 = &
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读数,我误解了我看到的内容。对不起。(一旦表明您已经看到,将删除此注释。)