C语言 整数在内存中存储

1.整数在内存中的存储
2.大小端字节序和字节序判断
3.浮点数在内存中的存储
正文开始
好的,同志们,我们今天要写的是整数在内存中存储的内容
1.整数在内存中的存储
整数的2进制表示方法有三种:原码、反码和补码
三种表示方法均有符号位数值位两部分,符号位用0表示“正”,用1表示“负”,而数值位最高的一位是被当作符号位,剩余的都是数值位。
正整数中原码 反码和补码相同。而负整数中原码就是将十进制转换为二进制就是原码,最高位为符号位‘1’表示负,反码则是原码除符号位外按位取反,补码则是反码+1就得到了补码。
比如-5 原10000000 00000000 00000000 00000101
反11111111 11111111 11111111 11111010
补11111111 11111111 11111111 11111011
而补码转换成原码为 除符号位取反 +1
补11111111 11111111 11111111 11111011
取反10000000 00000000 00000000 00000100
+1得原码 10000000 00000000 00000000 00000101
对于整型来说:数据存放内存中其实存放的是补码
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理。

2.大小端字节序和字节序判断

#include<stdio.h>
int main()
{
int a=0x11223344;
return 0;
}

大端字节序存储
在这里插入图片描述小段字节序存储
在这里插入图片描述
vs为小端存储
2.1什么为大小端
当数据在内存中存储的时候,当占用的字节数超过一个字节时,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储。
大端存储模式:是指数据的低位字节内容保存在内存的高地址处,而数据的高字节内容,保存在内存的低地址处。
小端存储模式:是指数据的低位字节内容保存在内存的低地址处,而数据的高字节内容,保存在内存的高地址处。
2.2练习
2.2.1练习1

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

#include<stdio.h>
int check_sys()
{
	int i = 1;
	return(*(char*)&i);
}
int main()
{
	int ret = check_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端");
	return 0;
}

在这里插入图片描述
练习2

#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;
}

结果为 a=-1,b=-1,c=255
结果为什么为这样呢?
char类型比较特殊,char是signed char还是unsigend是不确定的,是取决于编译器的,VS上char等价于signed char int==signed int
char类型 存八个比特位
而-1不管三七二十一 不管a是什么类型先存上
a 原 10000000 00000000 00000000 00000001 //整型占四个字节 32个比特位
反11111111 11111111 11111111 11111110 按位取反的反码
补11111111 11111111 11111111 11111111 加1为补码
而char 八个比特位要发生截断 两米高的门非要放进四米的柱子
截断 11111111 ——a
b 原 10000000 00000000 00000000 00000001 //整型占四个字节 32个比特位
反11111111 11111111 11111111 11111110 按位取反的反码
补11111111 11111111 11111111 11111111 加1为补码
//11111111 -b
c 原 10000000 00000000 00000000 00000001 //整型占四个字节 32个比特位
反11111111 11111111 11111111 11111110 按位取反的反码
补11111111 11111111 11111111 11111111 加1为补码
//11111111 -c
我们发现不管 a,b,c是什么类型当我们放-1的时候三个变量放的值是一样的,存的时候类型不起什么作用,只是表明有多大的空间,而我们用类型的时候
a b c以%d形式打印 //而%d形式是以十进制的形式打印有符号的整型,a b c为char类型要发生整型提升。(按符号位补齐32比特位)
11111111 11111111 11111111 11111111 a整型提升后 还是补码所以还有转换成原码,符号位不变 ,按位取反加1
10000000 00000000 00000000 00000001原码 -> a=-1
相同的道理 b也有符号 高位也是符号位 高位依然补1
11111111 11111111 11111111 11111111 补
10000000 00000000 00000000 00000001 取反加1 -> b=-1
而c无符号位 八个比特位都为有效位 无符号位整型提升高位补0
00000000 00000000 00000000 11111111 补码 正数原反补相同 所以这也是我们原码 ->c=255
所以结果为 -1 -1 255

练习3

#include<stdio.h>
int main()
{
	char a = -128;
	printf("%u\n", a);//%u打印无符号整数
	return 0; //a=4294967168
}

char占一个字节八个比特位 有符号位char的取值范围为-128——127
可以存下 -128
首先我们先写出-128的原反补
//10000000 00000000 00000000 10000000 原
//11111111 11111111 11111111 01111111 反
//11111111 11111111 11111111 10000000补
要把补码放到a里面去 只能放八个比特位
//10000000 -a
再以%u的形式打印需整型提升 按符号位提升 (%u认为内存里存的是无符号数 则没有原反补的概念)
//11111111 11111111 11111111 10000000 直接打印 a=4294967168

练
#include<stdio.h>
int main()
{
	char a = -128;
	printf("%u\n", a);//%u打印无符号整数
	return 0; //a=4294967168
}    //与上题相似 结果相同 可自行解决
#include<stdio.h>
int main()
{
	char a[1000];
	int i;
	for (i = 0; i <= 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));
	return 0;
}  // 结果为255

首先我们先说明一下strlen求字符串长度的原理是,统计的是/0之前的个数,而/0的ASCII值为0
char取值范围为 -128到127 也就是说i从0加到127再加1就是-128一直加 加到0 一共 127+128=255个数

练5

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

首先定义了i为无符号整数 而unsigned char 的取值范围为0-255,当for循环里面i++=255时,i自动回到0,然后一直循环往复,死循环打印hello world

好了,同志们。整型在内存中存储就此结束,以后还会进行补充 浮点数在内存中存储再见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值