整形数据在内存中的储存

目录

1.数据类型的介绍:

2.整形在内存中的储存方式: 

2.1原码、反码、补码的关系:

         2.2大小端介绍(字节储存的顺序问题

3.加减法运算的问题(数字大小超过类型的上限)

例题1:例题2:例题3:例题4:


1.数据类型的介绍:

char类型的变量在内存中是以ascⅡ的形式储存,所以也是整形家族的一员。


2.整形在内存中的储存方式: 

在计算机中整数有三种二进制的表示方法,即原码,反码,补码

在原码中最高位为符号位,0表示正数,1表示负数。

2.1原码、反码、补码的关系:

正整数的原码、反码、补码不变,都是相同的。

负整数的反码是原码的相反,即0变1,1变0,但符号位不变.

补码是反码加一得到的。

如:-1

  

对于整形在内存中是以补码的方式进行存储。

为什么呢?

因为cpu只有加法器,使用补码,我们能把符号位和数值位统一处理,加法和减法统一处理。

2.2大小端介绍(字节储存的顺序问题)

大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址
中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位 , ,保存在内存的高地
址中。

问什么会有大小端存储?

应为除啦一个字节的char,其他的整形都是多字节的,这是就会涉及每个字节存放顺序的问题,可以低地址处存放权重低的 ,也可以低字节处存放权重大的。

此处我们用计算机看看字节存放的顺序

可以看处78位于权重低的位置,放在低字节处,12位于权重高的地方位于高字节处。

此处我们用程序判断大小端的问题

大小端储存模式的判断 · 风夏/C语言进阶 - 码云 - 开源中国 (gitee.com)

#include<stdio.h>

int main()
{
	int a = 1;
	char* p = &a;
	if (*p)
	{
		printf("小端存储\n");
	}
	else
	{
		printf("大端存储\n");
	}
	return 0;
}


3.加减法运算的问题(数字大小超过类型的上限)

例题1:

#include <stdio.h>
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; 
}

char a占一个字节,二进制表示为:

-1占四个字节,在放入char类型时,因为放不下我们会发生截断,我们把最后8个比特位放进去

当它以%d的形式输出时,会发生补位的现象,现在最高位为一,前面就补3个字节的1,让后以%d的形式输出,所以第一个结果为-1,

同理可得第二个结果和第一个一样,第二个结果为-1

第三个当-1的补码放入unsigned char时,由于只有一个字节仍然为8个1;当它以%d的形式输出时,因为是无符号的,直接补0;即第三个结果为255 

例题2:

#include <stdio.h>
int main()
{
    char a = -128;
    printf("%u\n",a);
    return 0; 
}

-128存放的char中发生截取,后面因为%u的输出,原来a的类型为有符号的char,我们补位时不最高位的数字,即1(补位规则),让后以%u的形式输出,最后结果 

 例题3:

#include <stdio.h>
int main()
{
    char a = 128;
    printf("%u\n",a);
    return 0;
}

  char类型变量的大小为-128到127,此时128已超过范围,当128,放进去时会被视为-128,补位时char a是有符号的类型,补最高位的1,最后结果

例题4:

#include <stdio.h>
unsigned char i = 0;
int main()
{
    for(i = 0;i<=255;i++)
   {
        printf("hello world\n");
   }
    return 0; }

此题于上题类似,unsigned char 最大值为255,当i=256时,会被视为0,重新开始循环。所以此题为死循环

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值