当前位置: 首页 > news >正文

祭祀网站建设方案国家企业信用公示信息网官网

祭祀网站建设方案,国家企业信用公示信息网官网,7x7x7x7x8黄全场免费,高端平面设计网站目录 引言 1. 整数在内存中的存储 1.1 原码、反码和补码 1.2 为什么使用补码#xff1f; 1.3 示例代码#xff1a;整数的存储 2. 大小端字节序和字节序判断 2.1 什么是大端和小端#xff1f; 2.2 为什么会有大端和小端之分#xff1f; 2.3 字节序的判断小程序 2.…目录 引言 1. 整数在内存中的存储 1.1 原码、反码和补码 1.2 为什么使用补码 1.3 示例代码整数的存储 2. 大小端字节序和字节序判断 2.1 什么是大端和小端 2.2 为什么会有大端和小端之分 2.3 字节序的判断小程序 2.4 示例代码大小端存储的区别 3. 浮点数在内存中的存储 3.1 浮点数的表示方法 3.2 浮点数的存储结构 3.3 浮点数的编码示例 3.4 示例代码浮点数的存储 3.5 特殊情况0、无穷和 NaN 4. 内存对齐 4.1 为什么需要内存对齐 4.2 内存对齐的规则 4.3 示例代码内存对齐 4.4 使用 #pragma pack 指令 5. 结论 引言 在计算机系统中数据的存储是非常基础但极其重要的一部分。理解数据在内存中的存储机制不仅有助于我们编写更高效的代码还可以帮助我们理解一些计算机运行中的底层细节。这篇博客将为大家详细讲解整数和浮点数是如何存储在内存中的并且会解释大端字节序与小端字节序的区别最后介绍内存对齐的重要性及其实现方式。 1. 整数在内存中的存储 整数在内存中的存储主要有三种二进制表示方法原码、反码和补码。在深入理解这三种表示方法之前我们首先要了解计算机中的整数是以二进制形式存储的。 1.1 原码、反码和补码 原码原码是将数值直接按照正负数的形式翻译成二进制。最左边的位最高位用于表示符号0表示正数1表示负数其他位用于表示数值。例如5 的原码是 00000101而 -5 的原码则是 10000101。 反码反码是对原码的一种变形形式它的符号位保持不变其他位按位取反。例如-5 的反码是 11111010。 补码补码是在反码的基础上加 1 而得到的。例如-5 的补码是 11111011。在计算机系统中数据一律用补码来表示和存储这样做的好处是可以将符号位和数值位统一处理同时加法和减法也可以统一处理。 1.2 为什么使用补码 在计算机系统中使用补码来表示整数有几个显著的优势 统一处理符号位和数值位补码的表示方式可以将符号位和数值部分一起进行运算这简化了计算机的硬件设计。 加法和减法的统一性在补码的表示方式下加法和减法可以通过相同的硬件电路实现CPU 只需要一个加法器。 1.3 示例代码整数的存储 下面的 C 代码展示了正负整数在内存中的存储方式。 #include stdio.hvoid print_binary(int num) {for (int i 31; i 0; i--){printf(%d, (num i) 1);if (i % 8 0) printf( );}printf(\n); }int main() {int positive 5;int negative -5;printf(正数 5 的补码形式\n);print_binary(positive);printf(负数 -5 的补码形式\n);print_binary(negative);return 0; } 运行该代码可以看到 5 和 -5 在内存中的二进制表示其中负数的补码形式通过对正数按位取反加 1 来得到。 2. 大小端字节序和字节序判断 当数据在内存中存储时尤其是超过一个字节的数据如 int 型或 long 型存储的顺序变得非常重要这就涉及到 大端字节序Big-endian 和 小端字节序Little-endian 的概念。 2.1 什么是大端和小端 大端模式Big-endian数据的高位字节内容保存在内存的低地址处而数据的低位字节内容保存在内存的高地址处。简单来说就是先存储“大的部分”。 小端模式Little-endian数据的低位字节内容保存在内存的低地址处高位字节内容保存在内存的高地址处简单来说就是先存储“小的部分”。 举个例子假设有一个 16 位的数值 0x1122在大端模式下它会被存储为 地址 0x0010: 0x11 地址 0x0011: 0x22 而在小端模式下则会被存储为 地址 0x0010: 0x22 地址 0x0011: 0x11 2.2 为什么会有大端和小端之分 大小端模式的产生主要与处理器的设计有关。在 X86 结构中我们普遍采用小端模式而在一些特殊的嵌入式系统中则使用大端模式。此外很多 ARM 处理器可以由硬件来选择是大端还是小端模式。 大小端的存在并没有孰优孰劣更多是与硬件架构的历史和习惯有关。在实际编程中判断字节序有助于编写跨平台兼容的代码。 2.3 字节序的判断小程序 以下代码可以用来判断当前机器的字节序 #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; } 在上面的代码中我们通过将一个整型变量 i 的地址转换为字符指针并检查其第一个字节的值来判断机器的字节序。如果第一个字节是 1则说明是小端模式否则是大端模式。 2.4 示例代码大小端存储的区别 以下代码展示了大小端存储模式在内存中的差异 #include stdio.hvoid print_bytes(int num) {unsigned char *ptr (unsigned char *)num;for (int i 0; i sizeof(int); i){printf(字节 %d: 0x%02x\n, i, ptr[i]);} }int main() {int num 0x11223344;printf(整数 0x11223344 在内存中的存储情况\n);print_bytes(num);return 0; } 在小端系统上输出结果为 字节 0: 0x44 字节 1: 0x33 字节 2: 0x22 字节 3: 0x11 而在大端系统上输出结果则为 字节 0: 0x11 字节 1: 0x22 字节 2: 0x33 字节 3: 0x44 3. 浮点数在内存中的存储 浮点数的存储较整数要复杂得多因为它们需要同时存储符号位、指数和有效数字部分。在计算机中浮点数通常采用 IEEE 754 标准来表示。 3.1 浮点数的表示方法 根据 IEEE 754 标准任意一个二进制浮点数 V 可以表示为 S符号位当 S0 时V 为正数当 S1 时V 为负数。 M有效数字通常是大于等于 1 小于 2 的小数。 E指数部分。 3.2 浮点数的存储结构 浮点数按照 IEEE 754 标准存储时32 位的浮点数即单精度浮点数和 64 位的浮点数即双精度浮点数有不同的结构 32 位浮点数单精度 符号位 S1 位 指数 E8 位 有效数字 M23 位 64 位浮点数双精度 符号位 S1 位 指数 E11 位 有效数字 M52 位 3.3 浮点数的编码示例 例如考虑一个十进制数 -5.75我们想将其编码为 32 位浮点数 符号位 S由于数是负数符号位 S 为 1。 转换为二进制5.75 的二进制形式是 101.11。 标准化形式将 101.11 写成 1.0111 × 2^2。 指数 E指数部分为 2为了适应偏移量表示单精度浮点数的偏移量是 127所以 E 2 127 129即 10000001。 有效数字 M有效数字部分为 0111后面补 0直到总共占 23 位。 最终-5.75 的二进制表示为 1 | 10000001 | 01110000000000000000000 3.4 示例代码浮点数的存储 以下代码展示了浮点数在内存中的存储 #include stdio.hvoid print_float_bits(float num) {unsigned char *ptr (unsigned char *)num;for (int i 0; i sizeof(float); i){printf(字节 %d: 0x%02x\n, i, ptr[i]);} }int main() {float num 5.75;printf(浮点数 5.75 在内存中的存储情况\n);print_float_bits(num);return 0; } 运行该代码可以看到浮点数 5.75 在内存中的表示形式。浮点数的存储涉及到符号位、指数和有效数字的组合因此其内存表示比整数更复杂。 3.5 特殊情况0、无穷和 NaN 零的表示当符号位为 0 或 1指数部分和有效数字部分全为 0 时表示 0 或 -0。 无穷大和负无穷大当指数部分全为 1有效数字部分全为 0 时表示正无穷∞或负无穷-∞。 NaNNot a Number当指数部分全为 1有效数字部分不全为 0 时表示 NaN用于表示未定义的结果例如 0/0 或 √-1。 4. 内存对齐 内存对齐是指数据在内存中的存放方式需要遵循特定的对齐边界规则。内存对齐的目的是为了提高 CPU 访问数据的效率因为大多数处理器在对齐边界上访问数据时效率更高。 4.1 为什么需要内存对齐 内存对齐的主要原因有以下几点 性能现代 CPU 在读取内存数据时如果数据地址是对齐的读取速度会更快。对于非对齐的数据CPU 可能需要执行多次内存访问导致性能下降。 硬件限制某些架构的 CPU 只能从特定的对齐地址读取数据否则会产生硬件异常。 4.2 内存对齐的规则 内存对齐通常遵循以下规则 数据类型的对齐边界等于数据类型的大小。例如int 类型通常是 4 个字节因此它必须位于 4 的倍数的地址上。 结构体的总大小也应该是其最大成员对齐边界的整数倍这样可以确保结构体数组中的每个元素都能正确对齐。 4.3 示例代码内存对齐 以下代码展示了结构体在内存中的对齐情况 #include stdio.hstruct Example {char a;int b;short c; };int main() {struct Example ex;printf(结构体 Example 的大小: %lu\n, sizeof(ex));return 0; } 在大多数编译器中结构体 Example 的大小可能是 12 字节而不是简单的所有成员大小之和1 4 2 7 字节。这是因为编译器会插入填充字节来确保每个成员的对齐。 char a 后面会有 3 个填充字节使得 int b 可以位于 4 字节对齐的地址。 short c 也会被对齐到 2 字节的边界上。 4.4 使用 #pragma pack 指令 在一些情况下我们希望取消编译器的默认对齐方式可以使用 #pragma pack 指令来更改对齐规则。例如 #include stdio.h#pragma pack(1) struct PackedExample {char a;int b;short c; }; #pragma pack()int main() {struct PackedExample ex;printf(结构体 PackedExample 的大小: %lu\n, sizeof(ex));return 0; } 使用 #pragma pack(1) 后结构体的大小将变为 7 字节因为编译器不再插入填充字节。但是这样做可能会导致性能下降因为读取未对齐的数据需要更多的 CPU 周期。 5. 结论 数据在内存中的存储是理解计算机系统的基础之一。 整数的存储涉及到原码、反码和补码的概念而大小端字节序则影响了多字节数据的存储顺序。 浮点数的存储更为复杂需要考虑符号位、指数和有效数字的表示。 内存对齐则是为了提高 CPU 访问数据的效率通过对齐边界来优化内存访问性能。通过对这些内容的深入理解我们可以更好地编写高效且可靠的程序并理解程序在底层是如何运行的。 Now,以上便是本期回溯C语言的全部内容啦希望对大家有所帮助。同时也欢迎大家在评论区与我交流共同进步
http://www.w-s-a.com/news/730381/

相关文章:

  • 门户网站建设的背景和意义手机网站前
  • 国内免费视频素材无水印素材网站国家最新消息
  • 襄阳seo站内优化学做网站论坛教程
  • 文明网站建设情况报告wordpress伪静态配置
  • 牙科网站模板个人微信网站建设
  • 厦门公司注册网站dw做简单小说网站
  • 网站建好以后每年都续费么wordpress 仿聚划算
  • 单位网站建设收费标准网上开店铺需要多少钱
  • 灯饰网站需要这么做申请域名的流程
  • 软件下载网站怎么赚钱wordpress减少数据库查询
  • 什么兼职网站可以做视频剪辑常见的推广平台有哪些
  • 网站开发是用html还是jsp设迹官网
  • 查公司信息的网站怎么学wordpress
  • 白银做网站长春一般建一个网站需要多少钱
  • 帮人做钓鱼网站的人网络推广培训职业学校
  • 淘宝客有必须做网站吗网站开发的形式有( )
  • 网站建设:上海珍岛网页版qq空间登录
  • 网站服务器ipteahouse wordpress主题
  • 深州市住房保障和城乡建设局网站做网站公司叫什么
  • 织梦网站转跳手机站注册公司代理记账费用
  • wordpress建站Pdf亚马逊aws在线观看
  • 做网站的外包公司有哪些WordPress调用json数据
  • 做网站网站怎么赚钱网站的建设及维护报告
  • 可以做效果图的网站东莞网站优化什么方法
  • 网站和软件的区别怎么做招生网站
  • 雄安免费网站建设电话如何做网站推广 求指点
  • 十大免费cad网站入口软件北京做网站建设价格
  • 建设一个公司网站要具备什么网页制作的专业
  • 东莞seo建站排名全包网站
  • 网站建设的基本步骤有哪些软件商店下载官方