已知:
1. 负数的补码等于它的反码加1,即在其反码的最低位加1就为该数的补码
2. 该系统中int
型占4字节(32位二进制),char
型占1字节(8位二进制)
3. 字符在内存中以ASCII形式存储(A的为65,C为67)
4. 在内存中低地址存低位值,高地址存高位值
先定义一个int
型负数:
如:int i= - 48829
可知其相应的原码、反码和补码如下所示:
原码:1000 0000 / 0000 0000 / 1011 1110 / 1011 1101
反码:1111 1111 / 1111 1111 / 0100 0001 / 0100 0010
补码:1111 1111 / 1111 1111 / 0100 0001 / 0100 0011
假设该数在内存中的实际存放为:
low(&i) 0100 0011
0100 0001
1111 1111
high(&i+3) 1111 1111
然后用char
型指针p1
和p2
分别指向地址&i
和&i+1
,并进行输出,测试代码如下所示:
#include <stdio.h>
int main(void)
{
int i;
char *p1;
char *p2;
i = -48829; //假设负数存储形式为反码,即为:1111 1111 / 1111 1111 / 0100 0001 / 0100 0011
p1 = &i; //假设p1指向 0100 0011 (67)
p2 = p1 + 1;//假设p2指向 0100 0001 (65)
printf("%c\n", *p1); //输出字符C(67),得证
printf("%c\n", *p2); //输出字符A(65),得证
return 0;
}
分别得到p1
输出字母C
,p2
输出字母A
,即说明了&i
地址中的内容为0100 0011
,&i+1
中的内容为0100 0001
。
==即验证了是以补码形式存储的,而不是原码或反码!==