1空间做2个网站吗,wordpress修改404页面,企业信息平台查询,阜阳 做网站目录 一、整数在内存中的存储
二、大小端字节序和字节序判断
2.1为什么有大小端?
2.2请简述大端字节序和小端字节序的概念#xff0c;设计一个小程序来判断当前机器的字节序。#xff08;10分#xff09;-百度笔试题
方法一#xff08;char*强制类型转换#xff09…目录 一、整数在内存中的存储
二、大小端字节序和字节序判断
2.1为什么有大小端?
2.2请简述大端字节序和小端字节序的概念设计一个小程序来判断当前机器的字节序。10分-百度笔试题
方法一char*强制类型转换
方法二联合体
若想了解更多联合体的知识请见拙作
2.3unsign打印负数
2.4下列代码打印的结果
2.5下面代码的输出结果
三、浮点数在内存中的存储
3.1 浮点数存的过程
IEEE 754 对有效数字M和指数E还有一些特别规定。
至于指数E情况就比较复杂
3.2 浮点数取的过程
指数E从内存中取出还可以再分成三种情况
E不全为0或不全为1
E全为0
E全为1 一、整数在内存中的存储
在讲解操作符的时候我们就讲过了下面的内容 整数的2进制表示方法有三种即 原码、反码和补码 三种表示方法均有符号位和数值位两部分符号位都是用0表示“正”用1表示“负”而数值位最 高位的一位是被当做符号位剩余的都是数值位。 正整数的原、反、补码都相同。 负整数的三种表示方法各不相同。如图 原码直接将数值按照正负数的形式翻译成二进制得到的就是原码。 反码将原码的符号位不变其他位依次按位取反就可以得到反码。 补码反码1就得到补码。 对于整形来说数据存放内存中其实存放的是补码 二、大小端字节序和字节序判断
大端存储模式是指数据的低位字节内容保存在内存的高地址处而数据的高位字节内容保存在内存的低地址处。 小端存储模式是指数据的低位字节内容保存在内存的低地址处而数据的高位字节内容保存在内存的高地址处。 根据此图判断此时机器为小端因为44作为低字节内容按顺序排在最后应放在低地址处。
2.1为什么有大小端?
这是因为在计算机系统中我们是以字节为单位的每个地址单元都对应着一个字节一个字节为8 bit 位但是在C语言中除了8 bit 的 char 之外还有16 bit 2个字节的 short 型32 bit 4个字节的 long 型要看具体的编译器另外对于位数大于8位的处理器例如16位或者32位的处理器由于寄存器宽度大于一个字节那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
2.2请简述大端字节序和小端字节序的概念设计一个小程序来判断当前机器的字节序。10分-百度笔试题
方法一char*强制类型转换
int check_sys()
{int i 1;return (*(char*)i);
}
int main()
{int ret check_sys();if (ret 1){printf(小端\n);}else{printf(大端\n);}return 0;
} int i 1; 定义了一个整数 i 并赋值为1。在内存中整数通常占用4个字节这取决于系统但在这里我们假设为4字节。如果系统是小端的这四个字节的存储形式将是 01 00 00 00。如果是大端的存储形式将是 00 00 00 01 return ((char)i); 这行代码做了以下操作 1、i: 获取 i 的地址。 2、(char*)i: 将 i 的地址转换为 char 指针。由于 char 是1字节的我们可以通过 char 指针来 访问整数的每一个字节。 3、(char)i: 通过 char 指针解引用获取整数的第一个字节。 如果系统是小端的那么整数的第一个字节将是 1或者 01 in hex。如果是大端的那么整数的第一个字节将是 0或者 00 in hex。 在 main() 函数中根据 ret 的值即整数的第一个字节判断系统是大端还是小端并打印相应的结果。
方法二联合体
若想了解更多联合体的知识请见拙作 返回1是小端返回0是大端
如果系统是小端的那么在内存中存储这个整数的最低字节也就是字节 c将会是1因为最低字节存储在最低的内存地址处。而如果系统是大端的那么最低有效字节将会是0。
int check_sys()
{union{int i;char c;}un;un.i 1;return un.c;
}int main()
{int ret check_sys();if (ret 1){printf(小端\n);}else {printf(大端\n);}return 0;
}
2.3unsign打印负数
int main()
{char a -128;//10000000000000000000000010000000//11111111111111111111111101111111//11111111111111111111111110000000//10000000 - a//打印时发生整型提升//11111111111111111111111110000000//sign char 的取值范围:-128~127//unsigned char的取值范围:0~255printf(%u\n, a);//4,294,967,168//%u是十进制的形式打印无符号的整数return 0;
}
char类型存储的顺序如下 2.4下列代码打印的结果
int main()
{char a[1000];int i;for (i 0; i 1000; i){a[i] -1 - i;}printf(%d, strlen(a));//255return 0;
} char的范围-128~127 a[1]~a[1000]的值规律如下 -1 -2 -3 ...... -128 127 126 125 ...... 5 4 3 2 1 0 -1 -2 ...... -128 127 126 ......5 4 3 2 1…… strlen求字符串长度找的是\0\0的ASCII码值是0其实找的就是0所以到0就终止 所以strlen计算的长度为128127 255
2.5下面代码的输出结果
int main()
{int a[4] { 1, 2, 3, 4 };//小端环境int* ptr1 (int*)(a 1);int* ptr2 (int*)((int)a 1);printf(%x ,ptr1[-1]);printf(%x, *ptr2);return 0;
}
ptr1[-1]-- *(ptr1 - 1)--*((a1) - 1)--4 三、浮点数在内存中的存储 举例来说 十进制的5.0写成二进制是 101.0 相当于 1.01×2^2 。 那么按照上面V的格式可以得出S0M1.01E2。 十进制的-5.0写成二进制是 -101.0 相当于 -1.01×2^2 。那么S1M1.01E2。 IEEE 754规定 对于32位的浮点数最高的1位存储符号位S接着的8位存储指数E剩下的23位存储有效数字M
int main()
{int n 9;float* pFloat (float*)n;//int*printf(n的值为%d\n, n);//9printf(*pFloat的值为%f\n, *pFloat);//0.000000*pFloat 9.0;printf(num的值为%d\n, n);//1091567616printf(*pFloat的值为%f\n, *pFloat);//9.000000return 0;
} 创建了一个浮点数指针 pFloat 并将其指向 n 的内存地址。此时pFloat 指向的内存中存储的是一个整数值 9。 通过 pFloat 打印该值时由于 pFloat 是一个浮点数指针所以它会尝试将内存中的值解释为浮点数。在大多数系统上整数 9 和浮点数 9.0 在内存中的表示是不同的。 接下来你通过 pFloat 将该内存位置的值设置为 9.0。这意味着你现在改变了原来存储整数 9 的内存使其现在包含一个浮点数的表示。 再次尝试打印整数 n 的值时它会尝试将内存中的浮点数表示解释为一个整数。这就是为什么你得到了一个奇怪的数字 1091567616这个数字是 9.0 的 IEEE 754 单精度表示形式解释为整数时的结果。 而当打印 *pFloat 的值时它正确地显示为 9.0。 3.1 浮点数存的过程
但是因为存储有可能会改变原先的值。 10: 5.5 2: 101.1 科学计数法1.011 * 2^2 (-1)^0 *1.011 *2^2 S 0 E 2 M 1.011
int main()
{float f 99.7f;printf(%f\n, f);////0 10000001 01100000000000000000000//0x40 B0 00 00//1.01100000000000000000000 *2^2return 0;
}
IEEE 754 对有效数字M和指数E还有一些特别规定。
前面说过 1≤M2 也就是说M可以写成 1.xxxxxx 的形式其中 xxxxxx 表示小数部分。 IEEE 754 规定在计算机内部保存M时默认这个数的第一位总是1因此可以被舍去只保存后面的xxxxxx部分。比如保存1.01的时候只保存01等到读取的时候再把第一位的1加上去。这样做的目的是节省1位有效数字。以32位浮点数为例留给M只有23位将第一位的1舍去以后等于可以保存24位有效数字。
至于指数E情况就比较复杂
首先E为一个无符号整数unsigned int 这意味着如果E为8位它的取值范围为0~255如果E为11位它的取值范围为0~2047。但是我们知道科学计数法中的E是可以出现负数的所以IEEE 754规定存入内存时E的真实值必须再加上一个中间数对于8位的E这个中间数是127对于11位的E这个中间数是1023。比如2^10的E是10所以保存成32位浮点数时必须保存成10127137即10001001。
3.2 浮点数取的过程
指数E从内存中取出还可以再分成三种情况
E不全为0或不全为1 这时浮点数就采用下面的规则表示即指数E的计算值减去127或1023得到真实值再将有效数字M前加上第一位的1。 比如0.5 的二进制形式为0.1由于规定正数部分必须为1即将小数点右移1位则为1.0*2^(-1)其 阶码为-1127(中间值)126表示为01111110而尾数1.0去掉整数部分为0补齐0到23位 00000000000000000000000则其二进制表示形式为: 1 0 01111110 00000000000000000000000
以下两种了解便可
E全为0
这时浮点数的指数E等于1-127或者1-1023即为真实值有效数字M不再加上第一位的1而是还 原为0.xxxxxx的小数。这样做是为了表示±0以及接近于0的很小的数字。 1 0 00000000 00100000000000000000000
E全为1
这时如果有效数字M全为0表示±无穷大正负取决于符号位s 1 0 11111111 00010000000000000000000 好了关于浮点数的表示规则就说到这里。
今天就先到这里了 看到这里了还不给博主扣个 ⛳️ 点赞☀️收藏 ⭐️ 关注
你们的点赞就是博主更新最大的动力 有问题可以评论或者私信呢秒回哦。