数值存储方式
以int型为例,当有四个字节时,位权大的内存地址较高
*(char*)(0x61FE1C))
的含义分析,首先将地址做为一个字符变量的首地址,实际也就只有一个字节。最外层的*
表示取这个地址下的值
一个实例
# include "stdio.h"
int main(void){
int a=257;
printf("%p\n",&a);
printf("%d\n",*(char*)(0x61FE1C)); //这里的指定字符类型只是为了读取一个字节的数据
printf("%d\n",*(char*)(0x61FE1D));
printf("%d\n",*(char*)(0x61FE1E));
printf("%d\n",*(char*)(0x61FE1F));
}
结果如下图,
结果分析,对于257,存入字节中,应该需要占用两个字节如上图所示,
注意存储的数据是补码
当设置变量是255时出现一个奇怪的现象
结果分析,想要解释这种现象,还是需要知道计算机存储数据的方式。存在计算机中的数据都是以补码的形式存在的,简单介绍一下补码,反码和原码。人们认知的数据值就是原码,反码:原码负数时,在原码基础上除最高位符号位取反,补码:原码负数时,在反码的基础上加1。正数的三种码都一样。
对结果的解释:对于一个字节大小的数据,最高位就是符号位,可以看出是1,则这是一个负值,通过负值原码和补码的转换。可以尝试一下,负数原码到补码和补码到负数原码,两种转换方式都可以使用取反加1的方法,(符号位不变);则11111111取反后10000000在加1就是原码10000001,也就是人们认知的数据-1
可以通过改变a的值检测,这种假设,当a=127第一个字节值也是127;当a=128,第一个字节是-128;原码128(10)=10000000(2)反码:11111111补码:负10000000;这是符号不变,但数值相加进位到上一位,也就得到了-128