Linux C语言学习:数据类型

一、 为什么要引入数据类型

• 计算机中每个字节都有一个地址(类似门牌号)
• CPU通过 地址 来访问这个字节的空间
        0x20001103 1 0 0 1 0 0 1 1
        0x20001102 1 1 1 0 1 1 1 0
        0x20001101 1 1 1 1 0 1 0 1
        0x20001100 0 1 1 0 0 0 0 1(红色背景为地址)

施加int类型后,代表数值-290800982 

施加int类型后,代表数值-290800982

•  对于计算机系统,二进制0和1数据没有任何意义
• 为了更接近现实生活,人为的规定了数据类型,便于有效组织管理这些数据

二、整型-数据类型的定义 

 1、整型的取值范围

• /usr/include/limits.h文件中,有数据类型范围的定义

# define SCHAR_MIN (-128)
# define SCHAR_MAX 127
# define UCHAR_MAX 255
# define INT_MIN (-INT_MAX - 1)
# define INT_MAX 2147483647
# define UINT_MAX 4294967295U
/* Minimum and maximum values a `signed long int' can hold. */
# if __WORDSIZE == 64
# define LONG_MAX 9223372036854775807L
# else
# define LONG_MAX 2147483647L
# endif
# define LONG_MIN(-LONG_MAX - 1L) 

char:-128 ~ 127
short:-32768 ~ 32767
int:-2147483648 ~ 2147483647
long:-9223372036854775808 ~ 9223372036854775807

2、C语言中,如何获取某个数据类型所占用空间数? 

sizeof 运算符
 • sizeof是C语言中保留关键字,也是单目运算符。能获取某个数据类型所占用空间
的字节数。
• 使用形式:sizeof(变量名称) 或者 sizeof 变量名称 或者sizeof(数据类型)

int a;
sizeof(a) //√建议
sizeof a //√
sizeof(int)//√建议
sizeof int //× 

三、变量的作用与用法

1、变量的作用 

• 计算机中每一个字节的存储空间都有对应的地址,可以通过地址对其访问,进行读写操作。
0x20000000
• 若需要内存中存储一个整数58,怎么实现呢? 

• C语言设计了变量的概念,变量用来在程序中保存数据比如: int val = 58; //声明一个int型变量val,CPU为val分配4个字节,可以存储数值58
• C语言提供了直接操作地址的功能,通过指针来访问某个地址空间,读写数据,后面再讲。

2、变量的用法 

(1)变量的定义格式

        关键字类型 变量名; int a;
        关键字类型 变量名1,变量名2, ...; int a, b;

(2)如何进行变量赋值

变量初始化赋值,要使用赋值运算符=,可以初始化时赋值,也可以初始化后单独赋值:
         类型关键字 变量名 = 数值; int a = 20;
         类型关键字 变量名1 = 数值,变量名2 = 数值, ...; int a=10, b = 20
              = 表示将”= ”右边的值赋给左边的变量 

3、变量名要求

(1) 变量名以字母、数字、下划线组成;
(2) 变量名不能以数字、下划线开头;
(3) 变量名不能是关键字;
(4) 变量名不能包括空格、标点符合、和类型说明符。

4、变量的注意事项

nt num_1 = 5; //正确
int sum = 0; //正确
int 1_num = 5; //错误 不能数字开头
int %age = 18; //错误 不能有类型说明符(%、&、!、#、
@、¥)
int while = 23; //错误,while是C语言关键字
int name age = 10;//错误,不能有空格

变量必须先定义再使用
a = 100; //错误
int a;
变量在参与运算前,需要对其初始化:
int a;
int b;
b = a; //不会出现编译错误,但是存在运行风险,因为a的数值不确定。

 5、变量扩展

 下面三点,后续课程会深入讲解
        ① 变量的存储类型
                auto
                extern
                register
                static
        ② 局部变量和全局变量
        ③ 变量的作用范围

四、字符型变量 

1、定义格式 

char c1 = ‘A’;
char c2 = ‘a’;
char c3 = 66;

2、 注意字符常量要用单引号括起来,也可以用字符对应的ASCII码值进行赋值;
printf对应的格式符是%c;

五、浮点型-数据类型

1、浮点型 

浮点型:用于存储小数,即数学中的实数

 2、浮点数的表示形式

 

#include <stdio.h>
int main()
{
float f1 = 0.008;
float f2 = 8E-3;
float f3 = 8000;
float f4 = 8E+3;
printf("f1=%f,f2=%f\n", f1, f2);
printf("f3=%f,f4=%f\n", f3, f4);
return 0;
}f1=0.008000
f2=0.008000
f3=8000.000000
f4=8000.000000

 不论是浮点数形式,还是指数形式,输出效果是相同的

#include <stdio.h>
int main( )
{
float a = 1.12345678901234567890;
double b =
1.12345678901234567890;
long double c =
1.12345678901234567890;
printf("a = [%.30f]\n", a);
printf("b = [%.30lf]\n", b);
printf("c = [%.30Lf]\n", c);
return 0;
}a = [1.123456835746765136718750000000]
b = [1.123456789012345691247674039914]
c = [1.123456789012345691247674039914]

 绝大多数的浮点数是不能精确的表示的        

3、计算机浮点数格式标准

 IEEE-754标准规定:

单精度浮点数的最高位为符号位,S为0,正数,S为1,负数;
• 后面跟8位经偏移的阶码 (移码),偏移量为 127(科学计数法中,E可能为负数,所以规定,E的真实值需要再加上一个中间数,对于8位的E来说,中间数就是127
• 尾数用原码表示,且把尾数规格化为1.xxx,...x(x为0或1),并将1去掉,尾数用23位表示。

双精度浮点数的最高位为符号位
• 后面跟11位经偏移的阶码 (移码),偏移量为 1023,
• 尾数用原码表示,且把尾数规格化为1.xxx,...x(x为0或1),并将1去掉,尾数用52位表示。

举例:浮点数float 9.625 在内存中的存储 

#include <stdio.h>
int main()
{
float f = 9.625;
printf("%#x\n", *(int *)&f);
return 0;
}0x411a0000

快捷计算浮点型: 

Base Convert: IEEE 754 Floating Point

IEEE-754 Floating Point Converter

4、浮点数怎么作比较

(1)浮点数存储的时候,存在精度损失,大多浮点数不是一个精确表示的数。
(2)在浮点数比较的时候,可不可以使用==进行比较? 

测试程序1: 

#include <stdio.h>
int main() {
double a = 1.0;
double b = 0.9;
if ((a - b) == 0.1) {
printf("equal\n");
}
else {
printf("not equal\n");
}
return 0;
}not equal

 测试程序2:

为了更好地进行代码分析,将 a - b 的值、 0.1 的值都打印

include <stdio.h>
int main() {double a = 1.0;double b = 0.9;printf("%.30lf\n", a-b);printf("%.30lf\n", 0.1);return 0;
}0.099999999999999977795539507497
0.100000000000000005551115123126

(3)浮点数跟零值进行比较

#include <stdio.h>
#include <math.h>
int main() {
double a = 1.0;
double b = 0.9;
double t = fabs((a - b) - 0.1);
if (t < 0.00000000000001 ){
printf("equal\n");
}
else {
printf("not equal\n");
}
return 0;
}

 自定义精度:待比较的两个浮点数做减法,差值的绝对值小于精度,认为相等 ,反之不等

六、bool类型 

1、_Bool类型-基础类型 

1)从 C99 标准开始,增加了关键字 _Bool 用来表示布尔类型。

  • 只能取值为 1 或 0
  • 非零值为真,代表条件成立
  • 零为假,代表条件不成立
  • 占用的空间是1个字节,使用二进制的第0位来表示0和1
#include <stdio.h>
int main()
{
_Bool a;
a = -1;
if (a) {
printf("true %d\n", a);
}
else {
printf("false:%d\n", a);
}
printf("sizeof(_Bool)=%lu\n", sizeof(_Bool));
return 0;
}true 1
sizeof(_Bool)=1

2、bool类型

• C99 中增加了一个头文件 stdbool.h。并在其中定义了bool、true 和 false

/usr/lib/gcc/x86_64-linux-gnu/11/include/stdbool.h
#define bool _Bool
#define true 1
#define false 0 #include <stdio.h>
#include <stdbool.h>
int main()
{
bool a;
a = 10;
if (a) {
printf("true:%d\n", a);
}
else {
printf("false:%d\n", a);
}
return 0;
}true:1
#include <stdio.h>
#include <stdbool.h>
int main()
{
bool f = false;
printf("f = %d\n", f);
f--;
printf("f = %d\n", f);
f--;
printf("f = %d\n", f);
f--;
printf("f = %d\n", f);
return 0;
}

七、void类型 

  • 该类型也叫缺省型,代表没有类型。
  • 它通常被用作一种占位符,或用来表示“无返回值”的函数,或指向任一类型的指针等 
void类型的用法:
(1)定义不返回任何值的函数
void printHelloWorld()
{printf("Hello, World!");
}
(2)通用指针类型

         void *指针类型通常称为通用指针类型。这种指针可以指向任何类型的数据。 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32 MDK Keil5软件调试功能使用(无需连接硬件)

MDK Keil5 在线仿真STM32&#xff08;无需连接硬件&#xff09; 首先点击工具栏的魔术棒配置一下&#xff1a;&#xff08;记得选择自己的STM32芯片类型&#xff09; 开启调试 使用逻辑分析仪查看IO输出 会打开这个界面&#xff0c;点击左边的setup按钮 会打开这个窗口&am…

Golang | Leetcode Golang题解之第119题杨辉三角II

题目&#xff1a; 题解&#xff1a; func getRow(rowIndex int) []int {row : make([]int, rowIndex1)row[0] 1for i : 1; i < rowIndex; i {row[i] row[i-1] * (rowIndex - i 1) / i}return row }

npm install pubsub-js报错的解决汇总

我在练习谷粒商城P83时&#xff0c;选择分类时触发向后端请求选择分类catId绑定的品牌数据&#xff0c;发现前端控制台报错&#xff1a; "PubSub is not definded",找不到pubsub。 因为缺少pubsub包&#xff0c;所以开始安装此包。 于是在网上一顿搜索猛如虎&…

理解NSCopying协议

NSCopying 协议用于让对象能够被复制。实现这个协议的类需要定义如何创建该对象的副本。这个副本是独立的&#xff0c;不会与原对象共享内存地址。 为什么需要 NSCopying 协议&#xff1f; 当你需要复制对象时&#xff0c;例如将对象存储到一个集合&#xff08;如数组、字典&…

如何规避亚马逊测评的风险?

国外的真实刷手和服务商的账号风险主要是表现在以下几点&#xff1a; 1. 账号资源的重复利用&#xff0c;下单的产品上一秒高端品牌&#xff0c;下一秒地摊货&#xff0c;对账号的标签定位不清晰 2. 留Review的时间周期长 3. 账号的质量会参差不齐&#xff0c;有的上不了评价…

INT202 例题

算法复杂度 O(n)&#xff1a;表示算法的渐进上界。如果一个算法的运行时间是O(n)&#xff0c;那么它的运行时间最多与输入规模n成正比。换句话说&#xff0c;当输入规模n增加时&#xff0c;算法的运行时间不会超过某个常数倍的n。比如&#xff0c;如果一个算法的时间复杂度是O(…

CHATGPT升级plus(已有账号前提下)

注册wildcard(虚拟卡) 注册号账号后先进行充值&#xff0c;充值后选择CHATGPT一键升级按照他的流程来即可 Wildcard网址&#xff1a;Wildcard跳转注册 填写邀请码充值时少两美金合计14&#xffe5; 邀请码&#xff1a;OL3QXTRH

Linux系统之mv命令的基本使用

Linux系统之mv命令的基本使用 一、mv命令介绍1. mv命令简介2. mv命令的使用结果 二、mv命令的使用帮助1. 在命令行的帮助信息2. mv常用选项 三、mv命令的基本使用1. 创建源目录和目标目录2. 新建测试文件3. 将源目录文件复制到目标目录4. 将文件进行改名5. 将目录的所有文件转移…

Kimichat使用案例007:用kimichat批量重命名txt文本文件

文章目录 一、介绍二、txt文件集三、Kimi操作内容四、Kimi输出内容一、介绍 一个文件夹中有很多个txt文本文件,需要全部进行重命名。 二、txt文件集 三、Kimi操作内容 可以在kimichat中输入提示词: 你是一个Python编程专家,要完成一个关于批量重命名txt文本文件的Python脚本…

提示词工程基础:定义与重要性

目录 一、引言二、提示词工程的定义1. 概念明晰2. 技术框架3. 功能作用 三、提示词工程的重要性1. 核心作用强调2. 提升效率与降低成本3. 推动技术发展与创新 四、提示词工程的组成部分1. 提示词设计2. 模型训练与调整3. 效果评估与优化 五、实际应用示例1. 虚拟助手2. 自动新闻…

Three.js中的Raycasting技术:实现3D场景交互事件的Raycaster详解

前言 在Web开发中&#xff0c;Three.js是一个极为强大的库&#xff0c;它让开发者能够轻松地在浏览器中创建和展示3D图形。随着3D技术在网页设计、游戏开发、数据可视化等领域的广泛应用&#xff0c;用户与3D场景的交互变得日益重要。而要实现这种交互&#xff0c;一个核心的技…

YOLOv8改进 | Conv篇 | 利用YOLOv10提出的C2fUIB魔改YOLOv8(附代码 + 完整修改教程)

一、本文介绍 本文给大家带来的改进机制是利用YOLOv10提出的C2fUIB模块助力YOLOv8进行有效涨点,其中C2fUIB模块所用到的CIB模块是一种紧凑的倒置块结构,它采用廉价的深度卷积进行空间混合,并采用成本效益高的点卷积进行通道混合。本文针对该方法给出多种使用方法,大家可以…

上海亚商投顾:深成指、创业板指均涨超1%,电力股午后集体走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日低开后震荡反弹&#xff0c;深成指、创业板指均涨超1%&#xff0c;黄白二线依旧分化。电力、电网股午…

大模型卷出新高度|暴雨AI服务器M8878助解算力之困

当今世界&#xff0c;作为新一轮科技革命和产业革命的重要驱动力&#xff0c;AI已经成为“兵家必争之地”。我国也在政府报告中首次将“人工智能”行动纳入国家战略&#xff0c;开启了以人工智能为核心的数字经济高质量发展的新时代。 当今世界&#xff0c;作为新一轮科技革命…

使用GitHub托管静态网页

前言​&#xff1a; 如果没有服务器&#xff0c;也没有域名&#xff0c;又想部署静态网页的同学&#xff0c;那就可以尝试使用GitHub托管自己的网页​。 正文&#xff1a; 首先要有自己的GitHub的账号&#xff0c;如果没有可以自己搜索官网进行注册登录&#xff0c;国内对Gi…

将Java程序打包为为.exe文件

将Java程序打包为为.exe文件 将Java程序打包为为.exe文件分为俩个步骤&#xff1a; 1、将Java程序打包成Jar包&#xff08;此时就可复制桌面便于使用&#xff09; 2、打包为.exe文件&#xff08;需要借助工具&#xff09; 一、打包为.exe文件 1. file -> Project Structure…

Diffusers代码学习-LoRA训练

LoRA&#xff08;Low-Rank Adaptation of Large Language Models&#xff09;是一种流行的轻量级训练技术&#xff0c;它显著减少了可训练参数的数量。它的工作原理是在模型中插入少量的新权重&#xff0c;并且只训练这些权重。这使得使用LoRA进行训练的速度更快、内存高效&…

视频汇聚共享平台LntonCVS视频智能分析守护厨房食品安全应用方案

近年来&#xff0c;食品安全问题在我国频繁发生&#xff0c;对整个社会造成了严重的负面影响。尤其是校园食品安全关系到学生的健康、家庭的未来以及社会的稳定。学校持续加强食堂科学管理&#xff0c;并督促食堂经营管理方履行好食品安全主体责任&#xff0c;以提升食品安全水…

【Python】 Python中使用小数步长进行循环遍历

基本原理 在Python中&#xff0c;range() 函数是一个非常常用的工具&#xff0c;它能够生成一个整数序列。默认情况下&#xff0c;range() 接受三个参数&#xff1a;起始值、结束值和步长&#xff0c;其中步长默认为1。然而&#xff0c;range() 并不支持直接使用小数作为步长&…

Binary Ninja 4.0.5336 (macOS, Linux, Windows) - 逆向平台

Binary Ninja 4.0.5336 (macOS, Linux, Windows) - 逆向平台 请访问原文链接&#xff1a;https://sysin.org/blog/binary-ninja/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Binary Ninja A New Type of Reversing Platfo…