一位数据的告白:我在内存的日子(整型在内存中的存储)

前言

一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。比如一个整型在内存中占四个字节的空间。那它是如何在内存中存储的呢?

整型在内存中的存储

1.原码、反码、补码

计算机中的整数都可以用原码、反码和补码这样的二进制形式表示。

  • 这三种方法都有符号位数值位
  • 符号位都是用0表示“正”,用1表示“负”。
  • 对于数值位来说,正数的原、反、补码都相同
  • 负数的原码:将数值直接转换为二进制。
  • 负数的反码:符号位不变,其他位按位取反
  • 负数的补码:反码+1,也是原码自右向左遇到的第一个1之前按位取反

对于整型来说,数据在内存中是以补码的形式存储

  • 在计算机系统中,使用补码,可以将符号位和数值统一处理。并且加法和减法也可以统一处理(CPU只有加法器)。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
  • 这是整型在内存中的存储一位数据的告白:我在内存的日子(整型在内存中的存储)_第1张图片
    整型占四个字节的内存,也就是32位,那么20的二进制补码为0000 0000 0000 0000 0000 0000 0001 0100,由于二进制太长,所以现在的计算机大多用十六进制表示,则20表示为00 00 00 14
    哎?!这里的顺序怎么不太对劲呢???
    这就涉及到下面要说的大小端啦!

2.大小端

大小端是一种存储模式,顾名思义,分为大端存储模式和小端存储模式。

  • 大端存储:数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中(高地址存低位)
  • 小端存储:数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中(高地址存高位)
  • 对于上面的图片来说,地址由低到高,低位是14,也就是低地址存的是数据的低位,所以是小端存储。

3.练习

//输出什么
#include 
int main()
{
   char a= -1;
   signed char b=-1;
   unsigned char c=-1;
   printf("a=%d,b=%d,c=%d",a,b,c);
   return 0;
}
//输出什么?
#include 
int main()
{
   char a = -128;
   printf("%u\n",a);
   return 0;
}
//输出什么?
#include 
int main()
{
   char a = 128;
   printf("%u\n",a);
   return 0;
}
//按照补码的形式进行运算,最后格式化成为有符号整数
int i= -20;
unsigned  int  j = 10;
printf("%d\n", i+j);
//结果
unsigned int i;
for(i = 9; i >= 0; i--)
{
   printf("%u\n",i);
}
//结果
int main()
{
   char a[1000];
   int i;
   for(i=0; i<1000; i++)
   {
       a[i] = -1-i;
   }
   printf("%d",strlen(a));
   return 0;
}
//结果
#include 
unsigned char i = 0;
int main()
{
   for(i = 0;i<=255;i++)
   {
       printf("hello world\n");
   }
   return 0;
}

你可能感兴趣的:(C语言,c语言)