1-C语言的数据类型

1.梦的开始-Hello World

#include<stdio.h>

//引入头文件,就是为了获取stdio.h里面的东西,你以为你为什么能用printf函数呀

int main(){//表示主函数,int表示返回值类型,main表示函数名字

printf("Hello World");//{}表示函数体,函数的内容

return 0;//表示函数的结束,并且返回一个值,因为你规定了返回的是int

}

2.什么是数据类型?

数据类型:首先是将现实中的客观事物进行抽象化的处理,在计算机里面本质上没有办法直接处理现实事物,但是计算机里面所有的数据都是由0/1组成,没有所

谓的类型之分。数据类型主要是为了方便人们能够区分每个数据所表示的含义,就出现类型的概念。

注意:所以数据类型并不是给计算机来看的,而是给程序员来看。

说人话版本: "内存里全是 0 和 1,跟沙子一样没名字。类型就是贴标签:这块沙子当整数,那块当小数,别混了。标签是写给人看的,机器只认沙子。"

1.数据类型种类

1.1基本类型

基本类型:编译器内置的类型

整型

短整型:short 2字节

整型:int 4字节

长整型:long 4/8字节(32位系统4字节,64位系统8字节)

浮点型(实型)

单精度:float 4字节

双精度:double 8字节

字符型

字符型:char -> 'A'、'\n'、'0'

1.2构造类型

构造类型:由程序员自己创建的合法的数据类型

数组:是一组相同类型的元素的集合

结构体:是一组不同类型的元素的集合

共用体(联合体):一组不同类型的元素共用一段空间

枚举:列举某个范围内值

1.3指针类型:

指向合法类型空间的指针

指针类型:一般来说指的是指针变量。

·基本类型指针

·构造类型指针

·由void构成万用指针

注意:系统给到指针类型变量的大小是固定,具体大小取决于系统的位数。

1.4空类型

空类型:无值类型

void 和函数组成

无返回值

无参数

void和指针组成

通用类型指针

作用:类型的作用:用来确定系统分配给每一个数据类型的空间大小

如何解决问题

常量

常量:在程序运行过程中无法被改变的量(字面量)

1234...此类整数常量

'A'B''C'...此类字符常量

·"123456""ABCDEF"..此类字符串常量

//3是一个常量,4也是一个常量,4不能改变3,同样3也不能改变4,所以下述是错误x

3=4

注意:对于常量进行修改错误的,代码报错。

变量

变量:在程序运行过程中可以被修改的量(可变化的量)

6 + 6 =12

x+y=12//x和y可以看成是程序中的变量

变量实际上是内存中具有特定属性的存储单元,它是用来存放数据的。这个存储单元存放的数据就是:变量的值,这个值在程序运行期间是可以被改变的。

变量名

系统会把内存一个字节,一个字节的分割成若干个,然后进行一个编号。这个编号就是内存地址(无符号的整数),每增加一个字节,地址就会+1,操作系统在访

问存储单元的时候,就必须要知道内存地址。

**变量名会关联内存地址,操作变量名其实就操作内存。**

命名规则

C语言中命名标识符(名字)的时候需要符合以数字,字母,下划线组成的规则,并且只能由下划线和字母开头。

const int x = 10;//这种写法是对的

整形常量

十进制常量数:

1 18 99 168 348 //十进制常量,逢十进一

八进制常量数:(以0开头)

0777 0664 0111 //八进制常量 逢八进一 每一位能表示的最大的是7

0123对 0864 错 0108 错

十六进制常量数:(以0x开头)

//用字母来表示从10开始到15的数

//A->10 B->11 C->12 D->13 E->14 F->15

0xCF 0x1F 0x00 //逢十六进一

有符号和无符号区别

CPU把数据进行计算的时候,需要把变量的数据从存储单元中取出来CPU内部的寄存器(运算寄存器)(32bits4字节),当变量的数据小于寄存器的时候,有符号的数据拷贝到寄存器的时候,空出的高位,需要补符号位。无符号的数据,拷贝到寄存器,多出来位,补0.

//unsigned表示定义的变量是一个无符号的变量类型:无符号字符型变量

unsigned char c1 = 255;

//signed表示定义的变量是一个有符号的变量类型:有符号的字符型变量

signed char c2 = 255;

//1字节:8个比特位128 64 32168421:1111 1111

//寄存器:0000 0000 0000 0000 0000 0000 0000 0000默认右侧是低地址

c1:255-->1111 1111 -->取到寄存器里面--> 0000 0000 0000 0000 0000 0000 1111 1111 -> 255

//c2有符号的数据:有负数范围的

c2:255-->1111 1111-->取到寄存器里面-->1111 1111 1111 1111 111 1111 1111 1111 --> -1

在计算机中,CPU处理数据时,需要将数据从内存加载到寄存器中进行运算。寄存器是CPU内部的高速存储单元,通常比内存中的变量要大。例如,一个常见的寄存器大小是32位(4字节)。

当一个小于寄存器大小的变量被加载到寄存器中时,需要对它进行扩展,以填满整个寄存器扩展的方式取决于变量的类型

  1. 无符号(unsigned)变量

    • 无符号变量表示的是非负整数。

    • 当无符号变量被加载到寄存器时,如果变量的位数小于寄存器的位数,高位会被填充0。

    • 这样做的目的是为了保持数值的正数特性,避免因为扩展而改变变量的值。

  2. 有符号(signed)变量

    • 有符号变量可以表示正数、负数和零。

    • 当有符号变量被加载到寄存器时,如果变量的位数小于寄存器的位数,高位会根据变量的符号位进行扩展。

    • 如果变量是正数,高位填充0;如果是负数,高位填充1(即符号位扩展)。

    • 这样做的目的是为了保持数值的正负特性,确保扩展后的数值与原始数值在逻辑上是等价的。

总结来说,无符号变量在扩展时总是填充0,而有符号变量在扩展时会根据符号位进行扩展,以保持数值的正确性。这种扩展机制确保了在不同大小的数据类型之间转换时,数值的准确性和一致性。

1. 无符号变量(unsigned char)
  • 变量声明unsigned char c1 = 255;

  • 二进制表示:11111111

  • 加载到32位寄存器

    • 因为c1是无符号的,所以在扩展到32位时,高位(左边的24位)将被填充0。

    • 寄存器内容00000000 00000000 00000000 11111111

  • 结果:在32位寄存器中,c1的值仍然是255。

2. 有符号变量(signed char)
  • 变量声明signed char c2 = 255;

  • 二进制表示:11111111

  • 加载到32位寄存器

    • 因为c2是有符号的,且最高位(左边第一个位)是1,表示这是一个负数。

    • 在扩展到32位时,高位(左边的24位)将被填充1,以保持其为负数。

    • 寄存器内容11111111 11111111 11111111 11111111

  • 结果:在32位寄存器中,c2的值变成了-1(因为11111111在32位有符号整数中表示-1)。

总结

  • 无符号变量在扩展时,高位补0,保持数值不变。

  • 有符号变量在扩展时,根据符号位扩展,保持数值的正负性不变。

有符号和无符号最大的区别:有无符号位

注意:不用unsigned和signed修饰的变量,默认都是signed类型

在一定范围之内,肯定有一个整数和一个负数的补码是一模一样的。

各个类型的赋值

相关推荐
im_AMBER2 小时前
数据结构 13 图 | 哈希表 | 树
数据结构·笔记·学习·算法·散列表
LYFlied2 小时前
【算法解题模板】动态规划:从暴力递归到优雅状态转移的进阶之路
数据结构·算法·leetcode·面试·动态规划
名誉寒冰3 小时前
GDB 调试与 Core Dump(段错误)排查指南(Linux/C/C++)
linux·c语言·c++
Hcoco_me3 小时前
RTMPose_JSON相关解读
算法·数据挖掘·json·聚类
高洁013 小时前
DNN案例一步步构建深层神经网络(二)
人工智能·python·深度学习·算法·机器学习
aini_lovee3 小时前
改进遗传算法求解VRP问题时的局部搜索能力
开发语言·算法·matlab
老蒋新思维4 小时前
反脆弱性设计:创始人IP与AI智能体如何构建愈动荡愈强大的知识商业|创客匠人
人工智能·网络协议·tcp/ip·算法·机器学习·创始人ip·创客匠人
Salt_07284 小时前
DAY 36 官方文档的阅读
python·算法·机器学习·github
FMRbpm4 小时前
串练习--------535.TinyURL的加密和解密
数据结构·c++·新手入门