一流的盐城网站开发网站运营的思路
- 作者: 五速梦信息网
- 时间: 2026年04月20日 07:03
当前位置: 首页 > news >正文
一流的盐城网站开发,网站运营的思路,深圳人口,建网站平台哪家好整数在内存中的存储 我们来回顾一下#xff0c;整数在计算机是以补码的形式进行存储的#xff0c;整数分为正整数和负整数#xff0c;正整数的原码、反码和补码是一样的#xff0c;负整数的原码、反码和补码略有不同#xff08;反码是原码除符号位#xff0c;其他位按位取…整数在内存中的存储 我们来回顾一下整数在计算机是以补码的形式进行存储的整数分为正整数和负整数正整数的原码、反码和补码是一样的负整数的原码、反码和补码略有不同反码是原码除符号位其他位按位取反即0变成11变成0补码就是反码1负整数的补码变为原码也是一样的保留符号位其他位按位取反再1就可以得到原码。 在计算机储存数据的时候会有一个符号位最开头的数位用1来表示负数用0来表示正数来表示正负剩下的是数值位来表示数值。正数的原码、反码和补码是完全一样的这里注意符号位是不会变的负数的反码就是除了原码的符号位不变之外其他位按位取反就是0变成11变成0补码就是在反码的基础上加1 这里我们以32位机器来举例
大小端字节序 我们来引入一个例子 大家是不是看到存储的数据是倒过来的当数据超过一个字节的时候就会出现字节存储的顺序问题这就是大小端字节序存储的问题。
解释
大端字节序就是数据的高位存到低地址处低位存到高地址处。 小端字节序就是数据的低位存到低地址处高位存到高地址处。
我们以从左到右是从低地址到高地址进行增加为例 由此可见开始我们引入的例子是按小端存储的我是用VS2022来演示的。
练习
问题一
设计代码来判断当前机器的字节序
我们可以使用一个数字来进行判断这里我使用数字1数字1的十六进制表示为0x00000001,我们只要拿出第一个字节就可以判断大小端存储了如果拿出的是0就是大端字节序存储如果拿出的是1那就是小端字节序存储。
#include stdio.hint check_sys()
{int i 1;return ((char)i);
}int main()
{int ret check_sys();if (ret 1){printf(⼩端\n);}else{printf(⼤端\n);}return 0;
}代码分析题
代码一
#include stdio.hint 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有没有符号取决于编译器的我这里使用的是VS2022char是有符号的所以a和b 就会打印-1但是c 就不一样首先-1在内存中的原码是10000001反码是11111110补码是11111111由于 c 是无符号的所以在内存中的11111111的第一个1就不会解读为符号位而是正常的数位所以打印255。
来看一下运行结果
代码二
#include stdio.hint main()
{char a -128;printf(%u\n, a);return 0;
}首先 -128 写出二进制为1000 0000 0000 0000 0000 0000 1000 0000反码为1111 1111 1111 1111 1111 1111 0111 1111补码为1111 1111 1111 1111 1111 1111 1000 0000由于是char 类型所以发生截断以八个比特位来进行保存就是1000 0000以%u的形式打印%u是无符号的整型就是unsigned int 类型所以发生整型提升就变成1111 1111 1111 1111 1111 1111 1000 0000这个数字我们拿计算机算一下就会得出
来看一下运行结果 代码三
#include stdio.hint main()
{char a 128;printf(%u\n, a);return 0;
}128 的原码是 0000 0000 0000 0000 0000 0000 1000 0000由于是整数所以原码反码补码是一样的。由于是char 类型发生截断保留八个比特位就是1000 0000用%u来进行打印发生整型提升由于char 是有符号的所以提升为1111 1111 1111 1111 1111 1111 1000 0000 然后打印由于是无符号的整数打印其实结果和上一道题目的结果是一样的。 代码四
#include stdio.h
#include string.hint main()
{char a[1000];int i;for (i 0; i 1000; i){a[i] -1 - i;}printf(%d, strlen(a));return 0;
}这个我们就要思考 char 是有取值范围的-128~127一共有256个数字strlen遇到\0就会停止计算这里的a从-1开始存储当a变为-128时再减一就会变成127一直减到0之后减一变为-1依次类推形成一个循环结构就如下图所示所以strlen(a)的计算结果应该是0之前的255个数。 来验证一下
代码五
#include stdio.hunsigned char i 0;int main()
{for (i 0; i 255; i){printf(hello world\n);}return 0;
}这个代码还是一样拿出我们的循环图 当 i 从 1 开始加到255时再加1 就不是256而是255所以不会跳出循环而是一个死循环。
代码六
#include stdio.hint main()
{unsigned int i;for (i 9; i 0; i–){printf(%u\n, i);}return 0;
}这个代码其实不用画循环图也能做因为unsigned int 是无符号的整数i 永远大于等于0所以这还是一个死循环。
代码七
#include stdio.h//x86环境小端字节序存储int main()
{int a[4] { 1, 2, 3, 4 };int* ptr1 (int)(a 1);int ptr2 (int*)((int)a 1);printf(%x,%x, ptr1[-1], *ptr2);return 0;
}先看ptr1 a取出的是整个数组的地址a1是跳过整个数组ptr1-1由于prt1是int类型的所以ptr1-1就会往后移动一个int解引用就是指向 4
ptr2 由于是小端字节序存储我们来画一下内存图
由于a 是数组首元素的地址所以 a 其实指向 1 由于int) a 强制类型将a转换为int类型1后就是a的地址1指向01后面的00由于ptr2是int*类型搜易解引用就会取出四个字节的数据也就是0x02 00 00 00
浮点数在内存中的存储 首先我们要知道浮点数的存储和整数的存储是不一样的不信的可以看一下下面的运行截图 现在我们来探讨一下浮点数在内存中是如何存储的 由于浮点数的存储比较复杂为了方便大家快速了解我对此进行了一下总结 首先一个公式-1^S * M * 2^ E 浮点数也是有符号的所以我们用S二进制位所以S只能取 0 或 1来控制-1的0或1次方进而也就控制了浮点数的正负性然后就是我们将浮点数化成类似科学计数法的形式在二进制里我们化成1.xxxx*2^E), 之后我们去掉1留下的来的xxxxx就是M而E的处理就有点复杂因为E可能为负数所以为了避免负数的情况我们将其加上一个中间数127或者1023 注意了浮点数的二进制表示如0.5怎么表示小数部分要注意小数点后面浮点数的二进制权重是从2^ (-1)、 2^ (-2)、2^ (-3)…依次叠加的所以我们要凑出0.5也就是1因为1*2^(-1就是0.5 我们来看一下32位的float和64位的double存储情形
E加中间数也是根据浮点数的类型进行加的32的float加12764位的double 加1023
正常情况下 E不为全0或全1那就是正常处理减去中间数取出S得到正负取出M再加1得到一个1.xxxx然后通过公式-1^S * M * 2^E 特殊情况 当E位全0 当E为全0的时候在float下E就是-127在 double 下E就是-1023那么2^E就是一个很小的数接近0 当E为全1 当E为全1时,E就是一个很大的数2^E就会使这个浮点数接近无穷大。 现在我们来分析一下开头的例子
#include stdio.hint main()
{int n 9;float* pFloat (float*)n;printf(n的值为%d\n, n);printf(*pFloat的值为%f\n, *pFloat);*pFloat 9.0;printf(num的值为%d\n, n);printf(*pFloat的值为%f\n, *pFloat);return 0;
}9 的原码是0000 0000 0000 0000 0000 0000 0000 1001 32位的floatS是0E是取八位 0000 0000 M是000 0000 0000 0000 0000 1001由于E为全0所以浮点数无限接近0。
9.0 用浮点数的公式表示先算出M来9.0 转化为二进制 1001.0变为科学计数法就是1.0010 * 2^3 ,则M 为001后面凑0知道凑满23位E等于3127130化成二进制就是 1000 0010 由于是整数所以符号位取0。
所以在内存中9.0表示为 0100 0001 0001 0000 0000 0000 0000 0000
由于要进行整数打印将上面一串二进制直接翻译成整数拿计算机一算 结果就是我们打印的结果。
- 上一篇: 一流的微商城网站建设双城网站建设哪家好
- 下一篇: 一起学网站培训心得把自己的电脑做网站服务器
相关文章
-
一流的微商城网站建设双城网站建设哪家好
一流的微商城网站建设双城网站建设哪家好
- 技术栈
- 2026年04月20日
-
一流的天津网站建设云南网站营销
一流的天津网站建设云南网站营销
- 技术栈
- 2026年04月20日
-
一流的手机网站建设建设银行网站关闭闪付
一流的手机网站建设建设银行网站关闭闪付
- 技术栈
- 2026年04月20日
-
一起学网站培训心得把自己的电脑做网站服务器
一起学网站培训心得把自己的电脑做网站服务器
- 技术栈
- 2026年04月20日
-
一起装修网官方网站电商网站定制
一起装修网官方网站电商网站定制
- 技术栈
- 2026年04月20日
-
一起做网店潮汕站做网站花了2万多
一起做网店潮汕站做网站花了2万多
- 技术栈
- 2026年04月20日
