#include <stdio.h>
#include <stdlib.h>
int main() {
//void *p_v = malloc(4 * sizeof(char));
void *p_v = calloc(4, sizeof(char));
char *p_str = (char *)p_v;
//printf("p_str = %p\n", p_str);
*(p_str + 3) = ""0"";
int *p_num = (int *)p_v;
//printf("p_num = %p\n", p_num);
printf("*p_num = %d\n", *p_num);
free(p_num);
return 0;
}
运行结果是805306368。
各位高手,问个问题,这个结果为什么不是48呀?
其中””0″”的值是48。
它不是按照下面操作的吗?
00000000 00000000 00000000 00110000
str[0] str[1] str[2] str[3]
解决方案:10分
这和int的内存格式有关系,
x86的cpu是little endian 就是在低字节地址低位数, 高字节存放高位数
char原因是只有1个字节,没有问题,就是从第到高 排列
上述例子的4个char
0x00 0x00 0x00 0x30
–>
但是int有4个字节,作为整体,低位数放在低字节的地址,高位数放在高字节的地址,
例如你有一个数0x11223344,在内存中是这样的 44 33 22 11
因此,。
x86的cpu是little endian 就是在低字节地址低位数, 高字节存放高位数
char原因是只有1个字节,没有问题,就是从第到高 排列
上述例子的4个char
0x00 0x00 0x00 0x30
–>
但是int有4个字节,作为整体,低位数放在低字节的地址,高位数放在高字节的地址,
例如你有一个数0x11223344,在内存中是这样的 44 33 22 11
因此,。
解决方案:5分
谷歌搜索大小端
解决方案:5分
#include <stdio.h>
#include <stdlib.h>
int get_sys_endian(void)
{
int a = 0x1234;
char c = *(char*)&a;
if (0x12 == c)
{
printf("big endian\n");
return 1;
}
else
{
printf("little endian\n");
return -1;
}
return 0;
}
int main(void)
{
int pos = 0;
void *p_v = calloc(4, sizeof(char));
char *p_str = (char *)p_v;
if (get_sys_endian() == 1)
{
pos = 3;
}
*(p_str + pos) = ""0"";
int *p_num = (int *)p_v;
printf("*p_num = %d\n", *p_num);
free(p_num);
return 0;
}