【C语言】深入理解数据表示与存储

文章目录

  • 1.分析上述源程序中的变量在机器内是如何表示的
    • 1.1.并给出变量在内存中的存储情况(变量占多少个字节,每个字节的地址和存放的数据是多少)
    • 1.2.说明其存放顺序(大端、小端次序?)
    • 1.3.对齐方式(是否采用边界对齐,如何对齐)
  • 2. 分析程序的执行结果,给出其结果及说明。
  • 3.你的机器字长多少位?编写程序说明int类型的位数、最小值和最大值各是多少?
  • 4.编写程序分析说明,-1用int类型和unsigned int类型表示的结果分别是多少?

计算机内存是存储数据的重要组成部分。了解数据在内存中的存储方式对于理解计算机的工作原理和进行优化至关重要。本文将介绍数据在内存中的存储方式,并通过一个程序来说明:

int main()
{
	unsigned short i = 65535;
	int j = -2147483648;
	int k = 65536;
	char c1 = '\n', c2 = 'x';
	float x = 100.25671;
	double y = 567.89;
	char* str = "01as计算机\n01as\\";
	
	printf("%u\n", j);
	printf("%f\n", x);
	printf("%lf\n", y);
	printf("%s\n", str);
	printf("%d\n", i * i);

	return 0;
}

1.分析上述源程序中的变量在机器内是如何表示的

1.1.并给出变量在内存中的存储情况(变量占多少个字节,每个字节的地址和存放的数据是多少)

在这里插入图片描述

unsigned short i = 65535;

在这里插入图片描述

int j = -2147483648;

在这里插入图片描述

int k = 65536;

在这里插入图片描述

char c1 = '\n', c2 = 'x';

在这里插入图片描述

在这里插入图片描述

float x = 100.25671;

在这里插入图片描述

double y = 567.89;

在这里插入图片描述

char* str = "01as计算机\n01as\\";

在这里插入图片描述

1.2.说明其存放顺序(大端、小端次序?)

我们可以看到 j在内存中的存储:

int j = -2147483648;

在这里插入图片描述
在补码表示法中
-2147483648的二进制表示为:
1000 0000 0000 0000 0000 0000 0000 0000
32位系统中,int类型通常占用4个字节,因此在内存中以小端模式存储时,-2147483648会以00 00 00 80的形式存储。低位字节存储在低地址,高位字节存储在高地址,所以我的机器是小端模式

1.3.对齐方式(是否采用边界对齐,如何对齐)

在这里插入图片描述

  • unsigned short i: 占用2个字节,存储方式为小端序,即低地址存放低位,高地址存放高位,无需对齐
  • int j: 占用4个字节,以补码形式存储,最小值-2147483648以补码形式存储为0x80000000,采用边界对齐
  • int k: 占用4个字节,以原码形式存储,存储值为65536,采用边界对齐
  • char c1, c2: 每个char类型变量占用1个字节,以ASCII码形式存储,采用边界对齐
  • float x: 占用4个字节,采用IEEE 754标准存储,采用边界对齐
  • double y: 占用8个字节,采用IEEE 754标准存储,采用边界对齐
  • char *str: 存储字符串常量的地址,根据机器字长确定占用字节数,采用边界对齐
  • 注意:具体的边界对齐数取决于编译器和目标平台的规定。

如果将变量存放在结构体中:

struct S
{
	unsigned short i;
	int j;
	int k;
	char c1;
	char c2;
	float x;
	double y;
	char* str;
};

在这里插入图片描述
在这里插入代码片在这里插入图片描述

  • 由地址分布可以看出:vs默认对齐数是8字节
    显式对齐指令:某些编译器提供了特定的指令或编译选项,允许开发人员显式地指定结构体的对齐方式。例如,#pragma pack(n) 可以设置结构体对齐数为 n 字节

2. 分析程序的执行结果,给出其结果及说明。

printf("%u\n", j);
printf("%f\n", x);
printf("%lf\n", y);
printf("%s\n", str);
printf("%d\n", i * i);

在这里插入图片描述

  • printf("%u\n", j);
    在C语言中,使用%u格式化符号输出一个有符号整数时,会将其作为无符号整数进行解释。由于-2147483648的二进制补码表示是10000000 00000000 00000000 00000000,这个二进制数被当做无符号整数解释时,对应的无符号整数值就是2147483648。因此,使用%u格式化符号输出-2147483648时会打印出2147483648

  • printf("%f\n", x);
    在一个32位小端机器上,float类型通常采用IEEE 754标准来表示。根据IEEE 754标准,float类型使用32位(4字节)来存储,其中包括1位符号位,8位指数位和23位尾数位。
    对于浮点数100.25671,它首先会被转换成二进制表示。由于浮点数的精度有限,100.25671经过转换后可能会变成一个无限小数的近似值。这个近似值会以二进制形式存储在内存中。
    当使用printf函数以%f格式打印这个浮点数时,该函数会根据IEEE 754标准将存储的二进制值解释为一个浮点数,并输出对应的十进制表示。由于二进制到十进制的转换是一个近似过程,因此输出的结果可能是一个近似值,例如100.256706,而不是精确的100.25671

  • printf("%lf\n", y);
    当你使用%lf打印一个double类型的变量时,C语言会按照双精度浮点数的格式进行输出。在双精度浮点数中,通常会有小数部分,并且会以固定的格式打印出小数点后的数字。
    因此,当你使用%lf格式化符号打印double类型变量567.89时,输出为567.890000是正常的行为。这是因为printf函数默认会打印出小数点后6位的数字,即使它们是0。如果你希望打印更少的小数位数,可以使用%.nf来指定打印小数点后n位数字,其中n为你希望打印的小数位数。

  • printf("%s\n", str);
    %s打印字符串时\n表示换行,\\输出\

  • printf("%d\n", i * i);
    变量 i 被定义为无符号短整型(unsigned short),并赋值为 65535。然后使用 %d 格式化字符串来打印 i 与自身的乘积。
    在一个 32 位小端机器上,短整型通常会被编码为 16 位。因此,unsigned short 变量可以表示从 0 到 65535 的无符号整数。当 i 被赋值为 65535 时,它达到了最大可能的值。
    在 C 语言中,表达式 i * i 的类型会根据操作数的类型来确定。在这种情况下,i 被隐式地转换为整型进行计算,结果也为整型。因此,i * i 的结果将会是一个整型数
    当使用 %d 格式化字符串打印一个整型数时,printf 函数会按照有符号整型进行解释。因此,如果结果超出了有符号整型数的表示范围,就会导致溢出
    在 32 位小端机器上,有符号整型通常会使用补码来表示。补码的表示范围为 -2,147,483,6482,147,483,647。因此,如果一个计算结果超出了这个范围,就会导致溢出,并且结果会被截断为补码表示范围内的值。
    因此,当 i 的值为 65535 时,计算 i * i 的结果为 4294836225,这个值超出了有符号整型的表示范围。因此,在使用 %d 格式化字符串打印这个值时,会产生一个溢出的结果 -131071
    要修复这个问题,你可以将 ii * i 的类型都声明为无符号的,以便保证计算结果不会溢出。例如:

unsigned short i = 65535; 
printf("%u\n", (unsigned int)i * i);

在这个修正后的代码中,我将 ii * i 都声明为无符号类型,并使用 %u 格式化字符串来打印无符号整型数

3.你的机器字长多少位?编写程序说明int类型的位数、最小值和最大值各是多少?

#include <stdio.h>
#include <limits.h>

int main() {
    printf("机器字长:%d位\n", sizeof(void*) * 8);
    printf("int类型的最小值:%d\n", INT_MIN);
    printf("int类型的最大值:%d\n", INT_MAX);

    return 0;
}

在这里插入图片描述

4.编写程序分析说明,-1用int类型和unsigned int类型表示的结果分别是多少?

#include <stdio.h>

int main() {
    int signedInt = -1;
    unsigned int unsignedInt = -1;

    printf("用int类型表示-1的结果为:%d\n", signedInt);
    printf("用unsigned int类型表示-1的结果为:%u\n", unsignedInt);

    return 0;
}

在这里插入图片描述

当使用32位的二进制表示时,-1unsigned int类型中的表示为全部位均为1。下面是对-1的二进制表示的解释:

-1的二进制表示(32位):11111111111111111111111111111111

这里的每一位都是1,因为在无符号整数中,所有的位都用于表示数值。在32位的二进制表示中,每个位置上的数字可以是0或1,因此-1被表示为全部位均为1的数值。
相比之下,在有符号的int类型中,二进制表示采用补码形式。-1的补码表示是通过将1的二进制表示取反再加1来得到的。在32位的二进制表示中,-1的补码表示如下:

-1的补码表示(32位):11111111111111111111111111111111

无论是在有符号的int类型还是无符号的unsigned int类型中,-1的二进制表示都是全部位均为1。然而,它们的解释和含义不同,这取决于所使用的数据类型。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

统信UOS_麒麟KYLINOS禁用USB存储

原文链接&#xff1a;统信UOS/麒麟KYLINOS禁用USB存储 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇在统信UOS/麒麟KYLINOS禁用USB存储的文章&#xff0c;文章通过三种方式&#xff1a;1、在文件管理器中通过图形化方式移除USB&#xff1b;2、通过禁用USB存储模块…

Bumptop——3D桌面一键get

今天&#xff0c;博主给大家带来一款免费、炫酷的桌面真理工具——Bumptop。这是一款可使桌面变为极酷3D桌面的软件。采用极酷的3D技术&#xff0c;把图标立体化&#xff0c;同时拖拽动作也是别有动感&#xff0c;充满智慧&#xff0c;可以完全抛弃原先单调的2D和伪3D界面&…

【Axure教程】滑动内容选择器

滑动内容选择器通常是一种用户界面组件&#xff0c;允许用户通过滑动手势在一组内容之间进行选择。这种组件可以在移动应用程序或网页中使用&#xff0c;以提供直观的图片选择体验。 那今天就教大家如何用中继器制作一个滑动内容选择器&#xff0c;我们会以滑动选择电影为案例…

mysql binlog

binlog日志介绍 什么是 binlog binlog是server层共有的&#xff0c;是记录的数据更新历史&#xff0c;主要用来做主从同步和数据的实时备份。 binlog 怎么开启 mysql的配置文件添加相关配置并重启mysql # 1. linux打开mysql配置文件 vi /etc/my.cnf# 2. 添加binlog配置 [mysql…

Redis怎么保证数据不丢失

目录 一、Redis使用持久化保证数据不丢失 二、Redis 持久化的三种方式 三、混合持久化的流程 一、Redis使用持久化保证数据不丢失 Redis 中的数据是存放在内存中的&#xff0c;这样可以保证 Redis 高效的运行&#xff0c;然而内存中的数据会随着系统的重启而丢失&#xff0c;那…

栈与队列练习题

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

Python基础入门----如何通过conda搭建Python开发环境

文章目录 使用 conda 搭建Python开发环境是非常方便的,它可以帮助你管理Python版本、依赖库、虚拟环境等。以下是一个简单的步骤,演示如何通过 conda 搭建Python开发环境: 安装conda: 如果你还没有安装 conda,首先需要安装Anaconda或Miniconda。Anaconda是一个包含很多数据…

Pytorch D2L Subplots方法对画图、图片处理

问题代码 def show_images(imgs, num_rows, num_cols, titlesNone, scale1.5): #save """绘制图像列表""" figsize (num_cols * scale, num_rows * scale) _, axes d2l.plt.subplots(num_rows, num_cols, figsizefigsize) axes axes.flatten…

全新叙事赛道:诺亚引领不良资产合成潮流,DeFi生态再添“万亿”动力

在全球DeFi领域&#xff0c;一场革命性的变革正在悄然兴起。诺亚项目以其独特的商业模式和前瞻性的愿景成为DeFi 2.0的一股新力量。作为全球首家专注于不良资产合成铸币的平台&#xff0c;诺亚项目凭借其强大的经济模型和全新的叙事赛道&#xff0c;正迅速崭露头角&#xff0c;…

用requests库下载文件时的挂起问题:一步步诊断与解决方案

在使用 requests 库下载一个大小为125KB的文件时&#xff0c;用户遇到了一个问题&#xff0c;下载进程在代码的特定行挂起了。用户已经检查了操作系统的内存&#xff0c;发现大约有2GB的空闲内存可用。用户正在使用 requests 库的2、28、1版本&#xff0c;并寻求帮助来调试这个…

【LeetCode刷题-滑动窗口】--340.至多包含K个不同字符的最长子串

340.至多包含K个不同字符的最长子串 class Solution {public int lengthOfLongestSubstringKDistinct(String s, int k) {int len s.length();if(len < k){return len;}//滑动窗口的左右指针int left 0,right 0;//定义一个哈希映射HashMap<Character,Integer> hash…

「Verilog学习笔记」用3-8译码器实现全减器

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 首先列出3-8译码器和全减器的真值表 全减器真值表如下 3-8译码器真值表如下 timescale 1ns/1nsmodule decoder_38(input E ,input A0 …

【双十二预售】9.9元就能学《人工智能导论》!打卡赢红包,还有B站大会员等你领

双十二买什么最划算&#xff1f;那当然是知识&#xff01;知识是永存的&#xff01;是无价的&#xff01; Mo 平台活动力度拉满&#xff01;&#xff01;&#xff01; 原价 199.9 元的浙江大学《人工智能导论》课程 现在只要 9.9 元&#xff01;&#xff01;&#xff01; 参…

专家呼吁:家长应承担起数字时代家庭教育新责任

在教育数字化转型的推进下,教育理念不断发生变化,学校教育不再是唯一的主角,家庭教育开始受到重视,家庭也正在逐渐成为新的学习中心。 2022年《家庭教育促进法》正式推行实施,进一步强调了家庭教育在孩子成长过程中的重要地位以及父母在孩子教育于成长过程中不可或缺的重要作用…

总结 CNN 模型:将焦点转移到基于注意力的架构

一、说明 在计算机视觉时代&#xff0c;卷积神经网络&#xff08;CNN&#xff09;几十年来一直是主导范式。直到 2021 年 Vision Transformers (ViTs) 出现&#xff0c;这个领域才开始发生变化。现在&#xff0c;是时候采用受 Transformer 架构启发的基于注意力的模型了&#x…

typeof null的结果为什么是Object?

在 JavaScript 第一个版本中&#xff0c;所有值都存储在 32 位的单元中&#xff0c;每个单元包含一个小的 类型标签(1-3 bits) 以及当前要存储值的真实数据。类型标签存储在每个单元的低位中&#xff0c;共有五种数据类型&#xff1a; 如果最低位是 1&#xff0c;则类型标签标志…

使用vs studio 2017的cl命令查看c++类的模型结构

1、定位到当前CPP文件的盘符 2、定位到cpp文件所在目录 3、输入&#xff1a; cl /d1 reportSingleClassLayout查看的类名 所属文件名 例如&#xff1a; 我的代码 //源1.cpp class Base { public:int m_A; protected:int m_B; private:int m_C; //私有成员只是被隐藏了&#x…

美国FDA宣布MoCRA法规最新指导意见

美国食品药品管理局&#xff08;FDA&#xff09;在2023年11月8日发布了最新指导意见&#xff0c;宣布将《2022年化妆品法规现代化法案》&#xff08;MoCRA&#xff09;中的化妆品“设施注册”和“产品列名”执行时间延后六个月至2024年7月1日。这一举措是FDA对行业意见的积极回…

中级程序员——vue3+js+git面试题

&#x1f642;博主&#xff1a;小猫娃来啦 &#x1f642;文章核心&#xff1a;vue3jsgit面试题 文章目录 vue3最大缺点和优点&#xff1f;vue3组合式里面&#xff0c;如何去调用子组件里面的方法&#xff1f;watch和watcheffect有什么区别&#xff1f;计算属性和watch的区别是什…

vue3+ts扩展全局属性

在使用vue3 ts配置全局变量&#xff0c;需要添加一下扩展 文档 https://cn.vuejs.org/guide/reusability/plugins.html