C语言深入分析整型数据存储
1. 整型数据存储方式
在C语言中,整形数据可以使用不同的存储方式:有符号数表示正数和负数,无符号数只表示非负数。从存储方式上来讲,整型数据的存储可以分为大端和小端两种方式。
1.1 有符号数的存储
有符号数使用补码表示。最高位表示符号位,0表示正数,1表示负数,剩下的位表示数值。以8位为例,有符号数-1的补码为11111111。补码表示有一个很好的特性,就是加减法都可以同样适用,而且可以直接在二进制上进行操作。
1.2 无符号数的存储
无符号数以二进制形式存储,没有符号位。
1.3 大端和小端
大端和小端指的是从存储方式上来讲,高位字节在前还是低位字节在前。在大端模式中,最高字节在最低地址,最低字节在最高地址;在小端模式中,最低字节在最低地址,最高字节在最高地址。因为不同的CPU架构对于大端和小端的支持是不同的,所以在编写代码时要留意并考虑平台兼容性。
2. 示例说明
2.1 大端和小端的示例说明
下面这段代码将一个int类型的数字“0x12345678”转换成char*类型并分别输出每个字节的值,看看结果会是怎样。
#include <stdio.h>
int main()
{
int num = 0x12345678;
char *p = (char*)#
for (int i = 0; i < sizeof(int); i++)
{
printf("%x ", p[i]);
}
printf("\n");
return 0;
}
在大端机器上运行,结果为:
12 34 56 78
在小端机器上运行,结果为:
78 56 34 12
2.2 无符号数和有符号数的示例说明
下面这段代码将会输出有符号数和无符号数的不同内存表达方式。
#include <stdio.h>
int main()
{
int i = -100;
unsigned int u = i;
char *pi = (char*)&i;
char *pu = (char*)&u;
printf("i=%d, u=%u\n", i, u);
printf("i的内存表达:");
for (int j=0; j < sizeof(int); j++)
{
printf("%x ", *(pi+j));
}
printf("\nu的内存表达:");
for (int j=0; j < sizeof(unsigned int); j++)
{
printf("%x ", *(pu+j));
}
printf("\n");
return 0;
}
输出结果为:
i=-100, u=4294967196
i的内存表达:9c ff ff ff
u的内存表达:9c ff ff ff
可以看出,在内存中无符号数和有符号数的存储方式是相同的,但是表现形式不同。因此,在进行数据转换时要注意区别存储方式和表现形式的不同。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言深入分析整形数据存储 - Python技术站