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

news2024/10/3 17:04:39

文章目录

  • 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。然而,它们的解释和含义不同,这取决于所使用的数据类型。

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

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

相关文章

2023.11.18 - hadoop之zookeeper分布式协调服务

1.zookeeper简介 ZooKeeper概念: Zookeeper是一个分布式协调服务的开源框架。本质上是一个分布式的小文件存储系统 ZooKeeper作用: 主要用来解决分布式集群中应用系统的一致性问题。 ZooKeeper结构: 采用树形层次结构&#xff0c;没有目录与文件之分,ZooKeeper树中的每个节点被…

代码随想录 Day49 单调栈01 LeetCode LeetCodeT739每日温度 T496 下一个最大元素I

前言 折磨的死去活来的动态规划终于结束啦,今天秋秋给大家带来两题非常经典的单调栈问题,可能你不清楚单调栈是什么,可以用来解决什么问题,今天我们就来一步一步的逐渐了解单调栈,到能够灵活使用单调栈.注意以下讲解中&#xff0c;顺序的描述为 从栈头到栈底的顺序 什么时候用单…

“流量为王”的时代一去不返!如何押注互联网下一个黄金十年

目录 1“流量为王”的时代一去不返&#xff01;如何押注互联网下一个黄金十年 2AI夺走的第一份工作竟是OpenAI CEO&#xff1f;阿尔特曼被“扫地出门”&#xff0c;网友热评&#xff1a;是被GPT-5取代了吗&#xff1f;马斯克更“毒”&#xff0c;挂出求职申请链接 3GPT-4V新玩…

生活总是自己的,请尽情打扮,尽情可爱,,

同色系拼接羽绒服了解一下 穿上时尚感一下子就突显出来了 90白鸭绒填充&#xff0c;不仅时尚还保暖 设计感满满的羽绒服不考虑一下吗?

9 STM32标准库函数 之 独立看门狗(IWDG)所有函数的介绍及使用

9 STM32标准库函数 之 独立看门狗&#xff08;IWDG&#xff09;所有函数的介绍及使用 1. 图片有格式该文档修改记录&#xff1a;总结 函数描述格式&#xff1a; 函数名外设函数的名称函数原形原形声明功能描述简要解释函数是如何执行的输入参数{x}输入参数描述输出参数{x}输出…

OpenCV快速入门:图像滤波与边缘检测

文章目录 前言一、噪声种类与生成1.1 椒盐噪声1.2 高斯噪声1.3 彩色噪声 二、卷积操作2.1 卷积基本原理2.2 卷积操作代码实现 三、线性滤波3.1 均值滤波均值滤波原理均值滤波公式均值滤波代码实现 3.2 方框滤波方框滤波原理方框滤波公式方框滤波代码实现 3.3 高斯滤波高斯滤波原…

手把手教你用C语言写出“走迷宫”小游戏(能看懂文字就会自己敲系列)

目录 设计迷宫地图 设计主角——小球 完整代码 这次教大家编写一个简单的“走迷宫”小游戏&#xff0c;我们可以通过键盘上的‘W’、‘S’、‘A’、‘D’四个键来控制一个“小球”向上&#xff0c;下&#xff0c;左&#xff0c;右移动&#xff0c;目的就是让这个“小球”从起…

element表格头部加入图标

首先看看效果 下面是代码 <el-table-column prop"integralBalance"><template slot"header" slot-scope"scope"><div style"display: flex;justify-content: center;align-items: center;">积分余额<i class&qu…

mac无法向移动硬盘拷贝文件怎么解决?不能读取移动硬盘文件怎么解决

有时候我们在使用mac的时候&#xff0c;会遇到一些问题&#xff0c;比如无法向移动硬盘拷贝文件或者不能读取移动硬盘文件。这些问题会给我们的工作和生活带来不便&#xff0c;所以我们需要找到原因和解决办法。本文将为你介绍mac无法向移动硬盘拷贝文件怎么回事&#xff0c;以…

Mysql -常见函数

目录 字符串函数 数值函数 日期函数 流程函数 字符串函数 -- 拼接 SELECT CONCAT(Hello, World); -- 小写 SELECT LOWER(Hello); -- 大写 SELECT UPPER(Hello); -- 左填充 SELECT LPAD(01, 5, -); -- 右填充 SELECT RPAD(01, 5, -); -- 去除空格 SELECT TRIM( Hello World )…

sqli-labs关卡20(基于http头部报错盲注)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第二十关通关思路1、判断注入点2、爆数据库名3、爆数据库表4、爆数据库列5、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚…

基于 gin + websocket 即时通讯项目 (一、项目初始化)

基于 gin websocket 即时通讯项目 1、安装环境与初始化 搜索各种包官网 https://pkg.go.dev/ 1.1 安装 grom go get -u gorm.io/grom 1.2 安装 MySQL 驱动 go get -u gorm.io/driver/sqlite go get -u gorm.io/driver/mysql 1.3 安装 gin go get -u github.com/gin-gonic/gi…

深入了解Java 8 新特性:lambda表达式基础

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概000多字&#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#xf…

RIP路由信息协议

RIP路由信息协议(Routing Information Protocol) 最先得到广泛应用的协议&#xff0c;最大优点是简单要求网络中的每个路由器都要维护一张表&#xff0c;表中记录了从它自己到其他每一个目的网络的距离RIP是应用层协议&#xff0c;它在传输层使用UDP&#xff0c;RIP报文作为UD…

Git 简介及使用

前言 假设有这样一个场景&#xff0c;老板让员工做一个档案&#xff0c;员工这个档案做好了之后交给老板看&#xff0c;此时老板不满意&#xff0c;又让回去改&#xff0c;改完给老板看&#xff0c;但是老板又不是很满意&#xff0c;就这样改了又改&#xff0c;给老板看过之后&…

WPF中行为与触发器的概念及用法

完全来源于十月的寒流&#xff0c;感谢大佬讲解 一、行为 (Behaviors) behaviors的简单测试 <Window x:Class"Test_05.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winf…

YOLOv8改进 | DAttention (DAT)注意力机制实现极限涨点

论文地址&#xff1a; DAT论文地址 官方地址&#xff1a;官方代码的地址 代码地址&#xff1a;文末有修改了官方代码BUG的代码块复制粘贴即可 一、本文介绍 本文给大家带来的是YOLOv8改进DAT(Vision Transformer with Deformable Attention)的教程&#xff0c;其发布于2022…

java.net.UnknownHostException: eureka

java.net.UnknownHostException: eureka 哦。HOST漏了 #linux /etc/hosts #windows C:\Windows\System32\drivers\etc\hosts 127.0.0.1 eureka7000 127.0.0.1 eureka7001 127.0.0.1 eureka7002

Echarts柱状图配置代码详解,含常用图例代码

一、初识柱状图 从echarts官网引入基础的柱状图后&#xff0c;可以看到他有如下的配置项。我们可以改变各个配置项的属性&#xff0c;将图例调整为我们期望的效果。 二、常用配置项 因为引入echarts图例后&#xff0c;改变图例的东西都在option配置项中&#xff0c;所以其他部…

腾讯云轻量级服务器和云服务器什么区别?轻量服务器是干什么用的

随着互联网的迅速发展&#xff0c;服务器成为了许多人必备的工具。然而&#xff0c;面对众多的服务器选择&#xff0c;我们常常会陷入纠结之中。在这篇文章中&#xff0c;我们将探讨轻量服务器和标准云服务器的区别&#xff0c;帮助您选择最适合自己需求的服务器。 腾讯云双十…