参考资料

原码, 补码, 反码详解
C语言整数在内存中的存储

Anki制卡知识点

.a#变量,整型.a#
.|整型都有哪几种?
.|有符号的:int , short, long
无符号的:unsigned int, unsigned short, unsigned long
其中,short是short int的简写, long是long int的简写
.+

.|int类型是多少位
.|一般是16位,和具体操作系统定义有关
.+

.|short类型是多少位
.|与int一样,也是16位
.+

.| long类型是多少位
.|一般是32位
.+

.|什么是原码?
.|将一个整数转成二进制表示,就是原码,如12转成二级制为1100
.+

.|反码的计算方法是什么?
.|正数:反码与原码相同
负数:保留符号位不变,其他各位取反。
数字:-12
原码:1000 1100
反码:1111 0011
.+

.|补码的计算方式是什么?
.|正数:补码与原码相同
负数:在原码的基础上,符号位不变,其余各位取反,再加1
数字: -12
原码:1000 1100
反码:1111 0011
补码:1111 0100**
.+

.|补码如何转为原码?
.|补码的补码就是原码
-12
补码:1111 0100
取反:1000 1011
加1: 1000 1100
该数对应的就是-12的原码。
.+

.|在计算机内存中,以什么码来存储整数?
.|补码
.+

.|下面的代码输出内容是什么?
#include int main(int argc, char *argv){
short i = 0XFFFF;
printf(“>>>>>1: %x \n”, i);
printf(“>>>>>2: %d \n”, i);
printf(“>>>>>3: %u \n”, i);
}
.|输出如下:

1: ffffffff
>>>>>2: -1
>>>>>3: 4294967295

因为0xffff是正数,补码和原码相同,所以存入内存时,直接存储的是0xffff。
但是将其以有符号整型输出时,0xffff会被当做一个负数(因其首位为1)。
计算下补码0xFFFF对应的数字原码:
取反(符号位不变):1000 0000 0000 0000
加1: 1000 0000 0000 0001
对应的数字就是-1,所以%d的输出结果为-1.
而%u代表的是无符号整型,那就把0xFFFF当作是正数,正数的原码与补码相同,所以0xFFFF对应的数字是4294967295.

.|下面的这段代码,如何使用gdb查看变量在内存中的存储形式?

  1. #include <stdio.h>
  2. int main(int argc, char *argv){
  3. short i = 0XFFFF;
  4. int j = -1;
  5. printf(">>>>>1: %x \n", i);
  6. printf(">>>>>2: %d \n", i);
  7. printf(">>>>>2: %d \n", j);
  8. printf(">>>>>3: %u \n", i);
  9. }

.|依次使用下面的命令,可以查看变量在内存中存储:

root@looook:~/code/cdemo/ex4/build# gdb test2 (gdb) break 5 (gdb) x/2x &j (gdb) x/2x &i

image.png