C语言变量常量,基本数据类型及数据类型转换详讲(一)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: C语言变量常量,基本数据类型及数据类型转换详讲

🏠 官网:https://www.csuftsap.cn/

✏️ 本章所有提供代码均已测试,读万卷书不如行万里路,一定要把代码都自己敲一遍并测试

💬 如果这个世界真有奇迹,那也只是努力的另外一个名字,据说,每个降临到这个世界的人都自带粮草和地图,会迷途都是因为陷在眼前的一亩三分地,那些去看世界的人脚下一直有远方。

【在本篇文章中,你会学习到的内容如下】

1.数据在内存中的存储(二进制形式存储)

关于进制、原码反码补码、存储单位的具体,查看文章:https://blog.csdn.net/qq_62982856/article/details/126052638?spm=1001.2014.3001.5501

计算机要处理的信息是多种多样的,如数字、文字、符号、图形、音频、视频等,这些信息在人们的眼里是不同的。但对于计算机来说,它们在内存中都是一样的,都是以二进制的形式来表示。

📍 存储单位的 bit 和 byte

1️⃣ bit(比特)

大名鼎鼎的比特币就是以此命名的。。

bit 是计算机内存中的最小单位(也称原子单位),它的简写为小写字母 “b” 。

电脑是以二进制存储以及发送接收数据的。二进制的一位,就叫做 1 bit。也就是说 bit 的含义就是二进制数中的一个数位,即 0或者 1

2️⃣ byte(字节)

byte 是计算机系统中最小的存储单位,它的简写为大写字母 “B"。

字节 Byte 和比特 bit 的换算关系是 1 Byte = 8 bit 。

存储单位网速的单位,不管是 B 还是 b,代表的都是 字节 Byte

带宽的单位,不管是 B 还是 b,代表的都是 比特 bit

2.基本数据类型简介

2.1 C语言数据类型参考

2.2 为什么需要数据类型

C语言为什么要引入这么多的数据类型呢?因为C语言归根结底只是一门编程语言,一种让计算机为我们做事情的工具。引入这么多的数据类型是为了更加方便的表现现实世界中事物。C语言提供的多种数据类型让程序更加灵活和高效,同时也增加了学习成本。

首先我们看数据类型在内存中的表示,我们知道01 作为信息的载体,数据都是以二进制的形式存放在内存中。二进制的数据本身是没有意义的,如果我们要使得二进制数据有意义,必须人为的加上数据类型。

📝 比如说(4个字节,32位):

00000000 00000001 00000000 00000001
• 1

如果没有数据类型,它只是数据,0和1是信息的载体,它们具体是什么含义,我们并不知道。当我们把类型加上以后,就很明显的知道了具体含义。

类型是对内存数据施加的约束:

  1. 约束一:要把要把几个字节或几个存储单元看成一个整体进行解析。
  • 如果上述二进制我们用整型int类型来识别它,那我们把这四个字节作为一个整体进行解析。
  • 如果我们用短整型short类型来识别它,我们把两个字节作为一个整体进行解析。
  • 如果我们用字符型char类型来识别它,我们把一个字节作为一个整体进行解析。
  1. 约束二:是对二进制的解析方式不同。同样是4个字节,按照int和float类型解释得到完全不同的值。
  2. 约束三:类型约束了数据参与运算操作的集合,即我们的数据能够参与哪些运行,或者说类型告诉了编译器如何解释这个数值以及这个数值能够参与到哪些运算中。 比如说int类型的数据可以参与位运算,但如果你定义了一个数据的类型为double,该数据是不可以参与位运算的。

📍 由于类型的约束,使得计算机能够清晰的理解我们程序员的意图,就是说在我们编程的时候, 我们告诉了编译器此数据类型的数据采取什么样子的指令去参与运算,计算机就根据程序员所定义的类型来进行运算。数据类型用来说明数据的类型,确定了数据的解释方式,让计算机和程序员不会产生歧义。

💬 类型开辟内存空间的大小,大小决定了使用范围。

  • Java、C++、C#等在定义变量时也必须指明数据类型,这样的编程语言称为强类型语言。
  • 而PHP、JavaScript等在定义变量时不必指明数据类型,编译系统会自动推演,这样的编程语言称为弱类型语言。

那C语言是强类型还是弱类型语言呢?有人说强类型,也有人说是弱类型,其实争论这个本身没有意义。我们关注如何正确、安全的使用类型变量,避免隐式类型提升和转换才是正道。

3.整型

3.1 字节大小(长度)与取值范围

sizeof 操作符:用来获取某个数据类型或变量所占用的字节数。sizeof 是C语言中的操作符,不是函数。

📍 win64环境下的字节大小:

#include<stdio.h>
int main()
{
  printf("有符号短整型 short:%lld\n", sizeof(short));
  printf("无符号短整型 unsigned short:%lld\n", sizeof(unsigned short));
  printf("--------------------------------------------------\n");
  printf("有符号整型 int:%lld\n", sizeof(int));
  printf("无符号整型 unsigned int:%lld\n", sizeof(unsigned int));
  printf("--------------------------------------------------\n");
  printf("有符号长整型 long int:%lld\n", sizeof(long));
  printf("无符号长整型 unsigned long int:%lld\n", sizeof(unsigned long));
  printf("--------------------------------------------------\n");
  printf("有符号长长整型 long long int:%lld\n", sizeof(long long));
  printf("无符号长长整型 unsigned long long int:%lld\n", sizeof(unsigned long long));
  return 0;
}

📍 win32环境下的字节大小:

#include<stdio.h>
int main()
{
  printf("有符号短整型 short:%ld\n", sizeof(short));
  printf("无符号短整型 unsigned short:%ld\n", sizeof(unsigned short));
  printf("--------------------------------------------------\n");
  printf("有符号整型 int:%ld\n", sizeof(int));
  printf("无符号整型 unsigned int:%ld\n", sizeof(unsigned int));
  printf("--------------------------------------------------\n");
  printf("有符号长整型 long int:%ld\n", sizeof(long));
  printf("无符号长整型 unsigned long int:%ld\n", sizeof(unsigned long));
  printf("--------------------------------------------------\n");
  printf("有符号长长整型 long long int:%ld\n", sizeof(long long));
  printf("无符号长长整型 unsigned long long int:%ld\n", sizeof(unsigned long long));
  return 0;
}

这里就说明了在32 位环境以及 Win64 环境下整型数据类型的所占字节大小是相同的,但是在其它操作系统下计算出的字节大小就可能有所不同,因此使用的时候要注意移植性

🚩 总结(windows中)

数据类型 字节大小 取值范围
short 2字节 -32768~32767
unsigned short 2字节 0~65535
int 4字节 -2147483648~2147483647
unsigned int 4字节 0~4294967295
long 4字节 -2147483648~2147483647
unsigned long 4字节 0~4294967295
long long 8字节 9,223,372,036,854,775,808~9,223,372,036,854,775,807
unsigned long long 8字节 0~18,446,744,073,709,551,616

unsigned 是无符号的意思,我们以 short 和 short int 来说明,short 就是有符号数,unsigned short 是 无符号数,但它们占的字节是相同的,则能表示的数的个数也是一致的,short 从 -32768~32767 一共 65536 个整数,unsigned 从 0 ~ 65535 不也是 65536 个整数吗

3.2 整型对应占位符

#include<stdio.h>
int main()
{
  short int a = -520;
  unsigned short int ua = 520;
  printf("有符号短整型 a = %hd\n", a);
  printf("无符号短整型 ua = %hu\n\n", ua);
  int b = -1314;
  unsigned int ub = 1314;
  printf("有符号整  型 b = %d\n", b);
  printf("无符号整  型 ub = %u\n\n", ub);
  long int c = -201314;
  unsigned long int uc = 201314;
  printf("有符号长整型 c = %ld\n", c);
  printf("无符号长整型 uc = %lu\n\n", uc);
  long long int d = -5201314;
  unsigned long long int ud = 5201314;
  printf("有符号长长整型 d = %lld\n", d);
  printf("无符号长长整型 ud = %llu\n", ud);
  return  0;
}

🚩 总结

数据类型 占位符
short %hd
unsigned short %hu
int %d
unsigned int %u
long %ld
unsigned long %lu
long long %lld
unsigned long long %llu

4.浮点型

4.1 字节大小(长度)与取值范围

浮点数没有无符号数。

int main()
{
  printf("单精度浮点数 float:%lld\n\n", sizeof(float));
  printf("双精度浮点数 double:%lld\n\n", sizeof(double));
  printf("长双精度浮点数 long double:%lld\n\n", sizeof(long double));
  return  0;
}

🚩 总结

数据类型 存储大小 值范围 精度
float 4字节 1.2E-38 到 3.4E+38 6 位有效位
double 8 字节 2.3E-308 到 1.7E+308 15 位有效位
long double 16 字节 3.4E-4932 到 1.1E+4932 19 位有效位


相关文章
|
1月前
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
13天前
|
C语言
【C语言程序设计——入门】基本数据类型与表达式(头歌实践教学平台习题)【合集】
这份文档详细介绍了编程任务的多个关卡,涵盖C语言的基础知识和应用。主要内容包括: 1. **目录**:列出所有关卡,如`print函数操作`、`转义字符使用`、`数的向上取整`等。 2. **各关卡的任务描述**:明确每关的具体编程任务,例如使用`printf`函数输出特定字符串、实现向上取整功能等。 3. **相关知识**:提供完成任务所需的背景知识,如格式化输出、算术运算符、关系运算符等。 4. **编程要求**:给出具体的代码编写提示。 5. **测试说明**:包含预期输入输出,帮助验证程序正确性。 6. 文档通过逐步引导学习者掌握C语言的基本语法和常用函数,适合初学者练习编程技能。
32 1
|
1月前
|
存储 编译器 C语言
【C语言】C语言的变量和声明系统性讲解
在C语言中,声明和定义是两个关键概念,分别用于告知编译器变量或函数的存在(声明)和实际创建及分配内存(定义)。声明可以多次出现,而定义只能有一次。声明通常位于头文件中,定义则在源文件中。通过合理组织头文件和源文件,可以提高代码的模块化和可维护性。示例包括全局变量、局部变量、函数、结构体、联合体、数组、字符串、枚举和指针的声明与定义。
58 12
|
1月前
|
存储 算法 C语言
【C语言】字符常量详解
字符常量是C语言中处理字符数据的重要工具。通过单引号括起一个字符,我们可以方便地使用字符常量进行字符判断、字符运算和字符串处理等操作。理解字符常量的表示方法、使用场景和ASCII码对应关系,对于编写高效的C语言程序至关重要。
189 11
|
1月前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
64 8
|
1月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
53 7
|
1月前
|
C语言
【C语言】全局搜索变量却找不到定义?原来是因为宏!
使用条件编译和 `extern` 来管理全局变量的定义和声明是一种有效的技术,但应谨慎使用。在可能的情况下,应该优先考虑使用局部变量、函数参数和返回值、静态变量或者更高级的封装技术(如结构体和类)来减少全局变量的使用。
46 5
|
1月前
|
C语言
【C语言】<常量> 之群英荟萃
在C语言中,常量(Constants)是指在程序运行过程中其值不能被修改的固定值。常量包括数值常量(整型和浮点型)、字符常量、字符串常量、使用const关键字定义的常量变量以及枚举常量。
40 4
|
1月前
|
编译器 C语言
【C语言】常量的 “前缀和后缀” 大通关!
在C语言中,常量的前缀和后缀用于明确指定常量的类型和进制系统。前缀主要用于区分不同进制的数字常量,而后缀则用于区分不同类型的整数和浮点数。正确使用前缀和后缀,可以提高代码的可读性和可维护性,确保编译器正确地理解和处理常量。
63 1
|
3月前
|
存储 C语言
【c语言】数据类型和变量
本文介绍了C语言中的数据类型和变量。数据类型分为内置类型和自定义类型,内置类型包括字符型、整型、浮点型等,每种类型有不同的内存大小和取值范围。变量分为全局变量和局部变量,它们在内存中的存储位置也有所不同,分别位于静态区和栈区。通过示例代码和图解,详细阐述了这些概念及其应用。
67 1

热门文章

最新文章