第一章 C语言:数据存储

news2024/9/24 9:28:39

一、大小端存储

  • 大端存储:数据的低位字节存储在高地址

  • 小端存储:数据的低位字节存储在低地址

不同编译器有不同的存储方式

int a = 10;
char* p = (char*)&a;
printf("%x\n", *p);        // a  --->  0000000a
//0000 0000 0000 0000 0000 0000 0000 1010    
// 0    0    0    0    0    0    0    a        16进制数据:0x0000000a
//a在VS2019中的存储:0a 00 00 00 低地址 --> 高地址
//整型在内存中以补码存储

二、整型提升和截断

  提升:短字节数据类型 ---> 长字节数据类型

  截断:长字节数据类型 ---> 短字节数据类型

char ch = -10;
unsigned char c = -10;
//10000000000000000000000000001010    -10原码
//11111111111111111111111111110101    -10反码
//11111111111111111111111111110110    -10补码
//char类型的截断:11110110
//整型提升:
//11111111111111111111111111110110 ch补码  char是有符号类型数据,根据符号位数据补0或1
//00000000000000000000000011110110 c 补码  c 是无符号类型数据,前面直接补0
printf("%d\n", ch);    //将整型提升后的ch补码转换为原码输出为:-10
printf("%u\n", ch);    //将整型提升后的ch补码直接转为10进制数据输出: 4,294,967,286
printf("%d\n", c);     //将整型提升后的c 补码转换为原码输出为: 246
printf("%u\n", c);     //将整型提升后的ch补码直接转为10进制数据输出: 246

三、数据的二进制存储

  正数:原码 = 反码 = 补码

  负数:符号位不变,原码剩余位取反得反码,再加一得补码,补码取反加一得原码

  浮点数:遵循IEEE754标准,二进制浮点数表示为

      S为数符,M为尾码,E为阶码,

      float 是单精度浮点数,数码 1 bit,尾码 23 bit,阶码 8 bit,共32位

      double是双精度浮点数,数码 1 bit,尾码 52 bit,阶码 11 bit,共64位

//打印int、float、double类型在内存的二进制编码
#include <iostream>
using namespace std;

int count = 0;

template<class t>
void printbinary(t e, int length) {
    if (length > 1) {
        printbinary(e >> 1, length - 1);
    }
    putchar((e & 1) + '0');
    ::count++;
    if (::count % 8 == 0) {
        cout << ' ';
    }
    if (::count % (sizeof(e) * 8) == 0) {
        cout << endl;
    }
}

int main() {
    int i1 = 0, i2 = -1, i3 = 17, i4 = -17;
    printbinary(i1, 32);// 00000000 00000000 00000000 00000000
    printbinary(i2, 32);// 11111111 11111111 11111111 11111111
    printbinary(i3, 32);// 00000000 00000000 00000000 00010001
    printbinary(i4, 32);// 11111111 11111111 11111111 11101111
    cout << endl;

    int tmp = 0;
    float* f1 = (float*)&tmp;
    *f1 = 0;
    printbinary(*(unsigned*)f1, 32);//00000000 00000000 00000000 00000000

    float* f2 = f1;
    *f2 = -1;
    printbinary(*(unsigned*)f2, 32);//10111111 10000000 00000000 00000000
  // 1 01111111 00000000000000000000000 , E = 01111111B - 127D = 0, (-1)1 * 1.0 * 20 = -1
    float* f3 = f1;
    *f3 = 17;
    printbinary(*(unsigned*)f3, 32);//01000001 10001000 00000000 00000000
  // 0 10000011 00010000000000000000000 , E = 10000011B - 127D = 4, (-1)0 * 1.0001 * 24 = 10001B = 17
    float* f4 = f1;
    *f4 = -17;
    printbinary(*(unsigned*)f4, 32);//11000001 10001000 00000000 00000000
    cout << endl;

    long long temp = 0;
    double* d1 = (double*)&temp;
    *d1 = 0;
    printbinary(*(unsigned long long*)d1, 64);  //00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
  
    double* d2 = (double*)&temp;
    *d2 = -1;
    printbinary(*(unsigned long long*)d2, 64);  //10111111 11110000 00000000 00000000 00000000 00000000 00000000 00000000

    double* d3 = (double*)&temp;
    *d3 = 17;
    printbinary(*(unsigned long long*)d3, 64);  //01000000 00110001 00000000 00000000 00000000 00000000 00000000 00000000

    double* d4 = (double*)&temp;
    *d4 = -17;
    printbinary(*(unsigned long long*)d4, 64);  //11000000 00110001 00000000 00000000 00000000 00000000 00000000 00000000

    return 0;
}

四、结构体内存对齐

  对齐规则

  1. 第一个成员在与结构体偏移量为0的地址处

  1. 其他成员要对齐到对齐数的整数倍的地址处

  1. 对齐数:编译器默认的某个数字与该成员大小的较小值(VS默认值是8)

  1. 结构体总大小为最大对齐数的(每个成员变量都有一个对齐数)整数倍

  1. 如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍,结构体的整体大小就是最大对齐数(含嵌套结构体对齐数)的整数倍

#include <stdio.h>

struct S1 {
  char c1;
  int i;
  char c2;
};

struct S2 {
  char c1;
  char c2;
  int i;
};

struct S3 {
  char c1;
  char c2[20];
  char c3[20];
};

struct S4 {
  char c1;
  char c2[20];
  char c3[20];
  int i;
};

int main() {
  printf("%d\n", sizeof(S1)); // 12 = 1 + 3(对齐) + 4 + 1 + 3(对齐)
  printf("%d\n", sizeof(S2)); // 8 = 1 + 1 + 2(对齐) + 4
  printf("%d\n", sizeof(S3)); // 41 = 1 + 20 + 20
  printf("%d\n", sizeof(S4)); // 48 = 1 + 20 + 20 + 3(对齐) + 4
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/400350.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

教学场景应用视频试看预览功能

html5播放器视频预览功能效果 - 视频预览代码示例预播放一小段时间的视频内容&#xff0c;比如3分钟&#xff0c;然后引导用户付费观看或注册会员观看完整视频。原理&#xff1a;视频播放结束&#xff0c;执行s2j_onPlayOver()函数&#xff0c;显示提示信息或对话框&#xff0c…

Altium Designer(AD)软件使用记录03-AD软件中各层定义

Altium Designer(AD)软件使用记录03-AD软件中各层定义 重点&#xff1a; 1、常用的信号层&#xff1a;顶层&#xff0c;底层层&#xff0c;中间正片层&#xff0c;中间负片层 2、机械1层作为板框层&#xff0c;机械13层作为3D防止层&#xff0c;其他的机械层很少用 3、顶层阻焊…

AVL树详解+模拟实现

1&#xff1a;概念当数据有序&#xff0c;二叉搜索树将趋近于单叉树&#xff0c;查找元素相当于在顺序表中查找元素&#xff0c;效率低下&#xff0c;两位俄罗斯数学家G.M.Adelson-Velskii和E.M.Landis创建了AVL树。特性如下&#xff1a; 左右子树高度差的绝对值不超过1左右子树…

Django/Vue实现在线考试系统-06-开发环境搭建-Visual Studio Code安装

1.0 VS Code下载和安装 Visual Studio Code,简称 VS Code,是由微软公司开发的 IDE 工具。与微软其他 IDE(如 Visual Studio)不同的是,Visual Studio Code 是跨平台的,可以安装在 Windows、Linux 和 macOS平台上运行。不仅如此, Visual Studio Code 没有限定只能开发特定…

Revit中如何添加一个新的管道直径

有些时候项目当中会遇到一些管径比较小的管道&#xff0c;但是在直径中又没有适合的&#xff0c;怎么办?很简单&#xff0c;跟紧以下几个步理就可以了。 首先&#xff0c;我们拿一个管段为“铁&#xff0c;铸铁30”的为例子&#xff0c;如图1所示&#xff0c;系统中这管段是没…

1.数据结构的研究

数据结构很重要&#xff01; 数据结构很重要&#xff01;! 数据结构很重要&#xff01;! ! 思考 1.数据结构研究的内容有哪些&#xff1f;&#xff08;What&#xff09; 2.为什么要研究数据结构? ? (Why) 3.如何更好的研究数据结构? ? &#xff1f;(How) 注&#xff1a;特别…

Hadoop小结

Hadoop是什么Hadoop是一 个由Apache基金 会所开发的分布式系统基础架构。主要解决,海量数据的存储和海量数据的分析计算问题。广义上来说&#xff0c;Hadoop通 常是指一个更广泛的概念一Hadoop 生态圈。Hadoop优势Hadoop组成HDFS架构Hadoop Distributed File System&#xff0c…

蓝桥杯--ISBN号码

ISBN号码 技巧 数字转为字符【数字‘0’】 字符转为数字【字符-‘0’】 这道题比较简单 题目大意 每一本正式出版的图书都有一个 ISBN 号码与之对应&#xff0c;ISBN 码包括 9 位数字、1 位识别码和 3 位分隔符&#xff0c;其规定格式如 “x-xxx-xxxxx-x”&#xff0c;其中符号…

java多线程(二四)java多线程基础总结

一、进程与线程 1.进程 进程是操作系统结构的基础&#xff1b;是一次程序的执行&#xff1b;是一个程序及其数据在处理机上顺序执行时所发生的活动。操作系统中&#xff0c;几乎所有运行中的任务对应一条进程&#xff08;Process&#xff09;。一个程序进入内存运行&#xff…

前装L2标配车型均价连续第二年「低于」L1,市场进入爆发期

L2级辅助驾驶&#xff0c;正在进入市场红利期。 高工智能汽车研究院监测数据显示&#xff0c;2022年度中国市场&#xff08;不含进出口&#xff09;乘用车前装标配搭载辅助驾驶&#xff08;L0-L2&#xff09;交付1001.22万辆&#xff0c;首次突破千万辆规模&#xff0c;同时&a…

带你玩转spring声明式事务-使用中需要注意的点

本文向大家介绍spring声明式事务使用过程中需要注意的地方。事务特性1. 原子性&#xff08;Atomicity&#xff09;事务是一个原子操作&#xff0c;由一系列动作组成。事务的原子性确保动作要么全部完成&#xff0c;要么完全不起作用。2. 一致性&#xff08;Consistency&#xf…

九龙证券|6G概念重新活跃 数字经济板块引领A股尾盘回升

周三&#xff0c;沪深两市缩量调整&#xff0c;沪指全天以弱势震荡为主&#xff0c;尾盘在数字经济概念带动下快速拉升&#xff0c;全天微跌0.06%&#xff0c;报3283.25点&#xff1b;深证成指跌落0.09%&#xff0c;报15598.29点&#xff1b;创业板指跌落0.26%&#xff0c;报23…

[算法]归并排序

参考&#xff1a;《漫画算法-小灰的算法之旅》 目录 参考&#xff1a;《漫画算法-小灰的算法之旅》 1、什么是归并排序 2、归并的具体操作 3、代码 4、时间复杂度和空间复杂度 5、归并排序是稳定排序 1、什么是归并排序 归并排序就像是组织一场元素之间的“比武大会”&…

【C++】30h速成C++从入门到精通(二叉树)

说明为什么要在C当中单独再次提及数据结构中的二叉树&#xff1a;map和set特性需要先铺垫二叉搜索树&#xff0c;而二叉搜哦书也是一种树形结构二叉搜索树的特性了解&#xff0c;有助于更好的理解map和set特性二叉树中部分面试题有难度有些OJ使用C语言实现比较麻烦二叉搜索树概…

Kubernetes14:Helm为了部署像微服务这种的大型项目

Kubernetes14&#xff1a;Helm介绍&#xff08;为了部署像微服务这种的大型项目&#xff09; 1、Helm的引入 (1)之前方式部署应用基本过程 编写yaml文件 1、deployment kubectl create deployment nginx --imagenginx --dryrun -o yaml > nginx.yaml2、Service kubect…

Web前端:前端开发人员的职责有哪些?

前端开发&#xff0c;就是要创造上面提到的网站面向用户的部分背后的代码&#xff0c;并通过建立框架&#xff0c;构建沉浸性的用户体验。前端工程师还需要确保网站在各种浏览器和设备上都能正常运行&#xff0c;并且能够根据用户需求不断优化和改进网站。前端开发人员的角色和…

【C语言进阶】文本与二进制操作文件,优化通讯录。

前言&#xff1a;上篇文章&#xff0c;我们已经学习了有关本地磁盘文件的常用文件操作&#xff0c;已经能够对本地文件进行调用与读写。我们磁盘中还存在着一些内容用二进制存储的文件&#xff0c;这也就是我们今天将要讲解的内容。一、文本文件与二进制文件根据数据的组织形式…

SpiderFlow爬虫获取网页节点

SpiderFlow爬虫获取网页节点 一、SpiderFlow 文档地址&#xff1a;https://www.spiderflow.org/ 二、问题&#xff1a;获取一篇文章的标题、来源、发布时间、正文、下载附件该怎么获取&#xff1f; 举例&#xff1a;【公示】第三批智能光伏试点示范名单公示 三、抓取网页步骤…

Heatmap-based Out-of-Distribution Detection 论文阅读

原文地址 概要 我们的工作将分布失调【out-of-distribution,OOD】检测作为神经网络输出解释问题进行研究。我们学习了一种热图【heatmap】表示&#xff0c;用于检测OOD图像&#xff0c;同时可视化ID和OOD的图像区域。给定一个训练过的固定分类器&#xff0c;我们训练一个解码…

ArrayList源码分析(JDK17)

ArrayList类简介类层次结构构造无参构造有参构造添加元素add&#xff1a;添加/插入一个元素addAll:添加集合中的元素扩容mount与迭代器其他常见方法不常见方法不常见方法的源码和小介绍常见方法的源码和小介绍积累面试题ArrayList是什么&#xff1f;可以用来干嘛&#xff1f;Ar…