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
好了,同志们。整型在内存中存储就此结束,以后还会进行补充 浮点数在内存中存储再见