数据在内存中的存储(整数)

文章目录

  • 一.整数在内存中的存储
    • 1.原码,反码,补码的概念
    • 2.字节序
  • 二.练习
    • (1)
    • (2)
    • (3)
    • (4)
    • (5)
    • (6)
    • (7)

一.整数在内存中的存储

1.原码,反码,补码的概念

int a = 20;
int b = -10;

我们知道会为 a 和 b各分配4个字节的空间,那如何存储呢?

首先我们先了解一下原码,反码,补码的概念:

计算机中的有符号数有三种表示方法,即原码、反码和补码。

三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位三种表示方法各不相同。

原码:
直接将二进制按照正负数的形式翻译成二进制就可以。

反码:
将原码的符号位不变,其他位依次按位取反就可以得到了。

补码:
反码 + 1得到补码

正数的原、反、补码都相同。
对于整形来说:数据存放内存中其实存放的是补码。

数据在内存中的存储(整数)_第1张图片

数据在内存中的存储(整数)_第2张图片我们可以看到内存中的确存放的是补码,但细心的读者一定可以发现补码字节的顺序是反的。

2.字节序

大小端介绍:

大端字节序存储 模式,是指数据的低位字节保存在内存的高地址中,而数据的高位,保存在内存的低地址中;

小端字节序存储 模式,是指数据的低位字节保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。

数据在内存中的存储(整数)_第3张图片
了解了大小端以后,我们来看一道题:

设计一个小程序来判断当前机器的字节序

#include
int check_sys()
{
     
	int a = 1;  // 0x 00 00 00 01
	return *(char*)&a;
}
int main()
{
     
	if (check_sys() == 1)
		printf("小端\n");
	else
		printf("大端\n");
}

数据在内存中的存储(整数)_第4张图片我们可以发现只要我们判断出第一个字节的内容是1还是0就可以判断出机器的字节序了

因此我们只需要访问一个字节即可。

二.练习

(1)

//输出什么?
#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;
}

数据在内存中的存储(整数)_第5张图片

(2)

// 输出什么?
#include 
int main()
{
     
    char a = -128;
    printf("%u\n",a);
    return 0;
}

数据在内存中的存储(整数)_第6张图片

(3)

// 输出什么?
#include 
int main()
{
     
    char a = 128;
    printf("%u\n",a);
    return 0;
}

数据在内存中的存储(整数)_第7张图片

(4)

#include
int main()
{
     
	int i= -20;
	unsigned  int  j = 10;
	printf("%d\n", i+j); 
	//按照补码的形式进行运算,最后格式化成为有符号整数
	return 0;
}

数据在内存中的存储(整数)_第8张图片

(5)

#include
int main()
{
     
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
     
		printf("%u\n", i);
	}
	return 0;
}

数据在内存中的存储(整数)_第9张图片

(6)

#include
int main()
{
     
    char a[1000];
    int i;
    for(i=0; i<1000; i++)
   {
     
        a[i] = -1-i;
   }
    printf("%d",strlen(a));
    return 0;
}

数据在内存中的存储(整数)_第10张图片

数据在内存中的存储(整数)_第11张图片

(7)

#include 
unsigned char i = 0;
int main()
{
     
    for(i = 0;i<=255;i++)
   {
     
        printf("hello world\n");
   }
   return 0;
}
// 死循环打印hello world

数据在内存中的存储(整数)_第12张图片
数据在内存中的存储(整数)_第13张图片
i = 256 时,截断放在unsigned char 里面是 00000000

因此开始死循环

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