C语言基础犄角旮旯的知识之数据类型

简介: C语言基础犄角旮旯的知识之数据类型

目录


我们都知道 程序 = 数据结构 + 算法,而学习数据结构前,一定要把数据类型啃透,负责就可能出现各种段错误或者溢出的错误。而对于初学者来说,学习数据类型的基本知识是容易的,但是有些底层知识与比较偏的知识,我认为也是需要掌握的。


一、c语言的数据类型

1.基本类型

数据在计算机底层的存储

       要注意的东西来了

第二个小知识

浮点常量小知识

运算符

细碎的知识


正文


一、c语言的数据类型


1.基本类型


  C语言为我们定义好的类型,我们直接拿来用。

   主要针对:

   数:整数、浮点

 

   1.1整型

   char/unsigned char : 1byte = 8bits

       char: -128 ~127

       unsigned char: 0 ~ 255

 

   short/unsigned short: 2 bytes

   int/unsigned int: 4 bytes

   long / unsigned long: 8bytess

 

   在ubuntu18.04 【在不同的编译器下,字节长度不一样】

   sizeof(short) = 2;

   sizeof(int) = 4;

   sizeof(long) = 8;

 

   1.2 浮点型


       float :单精度浮点数 sizeof(float) = 4

       double:双精度浮点数 sizeof(double) = 8

       long double 长双精度浮点数 sizeof(long double) = 12(>=10)

     

       C语言中,整数默认的类型是int,小数默认的是double类型。

     

       typeof(1) = 4

       typeof(1.0) = 8

 

2.构造类型:自定义的类型

   C语言中,允许我们程序员自定义类型。

   2.1数组

       int a[4];// typeof(a) = int[4]

     

       int b[10];//typeof(b) = int[10]

     

       typeof(a) != typeof(b)

     

       typeof(a[0]) : int

       typeof(b[0]) : int

       所以:typeof(a[0]) = typeof(b[0])

 

3.void类型

   在c语言中,void出现在三个地方

   (1)void当函数的参数,表示该函数无参。

   int func(void)

   {

 

   }

   (2)void当函数的返回值类型,表示该函数无返回值。

   void func(int a)

   {

     

   }

 

   调用:int m = func(6);

   func(6);

 

   (3)void* 表示一个通用指针,可以指向任何数据类型。


数据在计算机底层的存储


整数在计算机中是如何存放的呢?

       是通过二进制的补码形式存放的。

       补码:正数的补码是其本身                  负数:是其绝对值的原码取反加1


要注意的东西来了


举个栗子:char类型是1字节,范围是 “-128~127”


               而 unsigned char类型也是1字节,但范围是“0~255”


那同学们有没有思考过,同一个类型,有符号与无符号的范围这么规定,具体原因是什么呢?

其原因就是正数与负数在计算机中的存储形式了

比如一个1字节,也就是8bit的负数“-1“ 它的存储形式为 “1111 1111”

而一个1字节,8bit的正数“1”,它的存储形式也为“1111 1111”

其规律就是一个n字节的存储类型,他的“-x”与“2^n-x”在计算机里的存储形式是一样的

所以char类型“128~255”分别与unsigned char类型“-128~255”在计算机里的二进制存储形式是一样的,所以有符号与无符号将这两类分开,就不会产生歧义。


在CPU底层是没有符号位概念的,都是数值位,都参与运算,至于这个数是整数还是负数,就得看编译器的词义了,意思是说,你把这个数当做是一个有符号的数,还是一个无符号的数。


第二个小知识


C语言允许不同类型的整型相互赋值


有人提出,长度不一样,如何赋值呢?

       标准C建议如下:

       (1)长 - 》短

           低字节直接拷贝,高字节直接丢弃。

     

       (2)短-》长

           低字节直接拷贝,高位补什么呢?

               if 短的是有符号数,高位就全部补符号位。

               if 短的是无符号数,高位就补0.


下面说一个快捷计算方法:


1.对一个数的二进制取反<==>这么多位“1”减这个数


如一个数的二进制为“0111 1001”,取反为“1000 0110”,也可以用“1111 1111”减“0111 1001”一样可以得到这个数,二进制下也许看不出这个方法的快捷,但在十进制下就完全不一样了


又比如,我们要对112这个8bit的数取反,正常方法要先转换为二进制再取反,得到去饭店二进制后再转成十进制,但是真的上面这个快捷方法后,我们就能直接计算。我们知道8bit全1为255,所以我们只需要用255-112,就能得出112取反的十进制为143了。怎么样,是不是很简单。


同样,有些计算中,如计算负数的补码:原码取反加1,就可以直接使用上面的方法,取反是2^n-1-x,那取反加一不就是2^n-x吗。


浮点常量小知识


由整数部分,小数点,小数部分组成,一个e/E,一个可以带符号的整型指数和一个表示类型(e/E表示科学计数法,想必大家在计算机上都见过)


而有一个需要注意的地方:字母e/E前面必须有数字;后面必须为整数(正整数、负整数)

       (这是为什么呢?也许你觉得字母e/E前面的1可以省略,但是请联系字符定义,第一位不可以是数字,这样就能规避歧义)


运算符


我们再讲一些运算符的小知识吧😁


运算符的结合性:决定先算哪个操作数的问题

运算符的优先级大家应该都知道


12.png


最后一个逗号运算符一个见得少,单独说一下。


逗号表达式形式:

                           表达式1,表达式2,表达式3....表达式n

                           求值顺序:

                                  先求表达式1的值,然后再求表达式2的值。

                                  再求表达式3的值,。。。整个逗号表达式的值,就是表达式n的值。


细碎的知识


1、在c语言中,会自动向高精度类型转型。


2、逻辑表达式的值:


                    逻辑真     1(非0)


                    逻辑假          0


3、C语言运算符是惰性运算


             (1) a&&b&&c


                    只有a为真时,才需要判断b的值;


                    只有当a和b都为真时,才需要判断c的值。


                 


             (2)a||b||c


                   只要a为真,就不必判断b和c的值;


                   只要a为假,才需要判断b的值;


                   只要a和b都为假,才需要判断c的值。


             总而言之,如果事先知道表达式的值,那么后面的运算符表达式就不需要执行啦,因为没有必要。


4、‘<<’按位左移


                           a << n位: 把a按bit位整体左移n位。


                                  1.高位左移后,舍弃,低位补0;


                                2.如果左移舍弃的高位全部为0,那么左移n位,就表示在原值乘以2的n次方。


5、>> 按位右移


                           x >> n: 把x按bit位整体右移n位。


                                  低位右移后,舍弃;那么高位补什么呢?


                                  对于无符号数,高位全部补0;


                                  对于有符号数,高位全部补符号位。



相关文章
|
2月前
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
1月前
|
C语言
【C语言程序设计——入门】基本数据类型与表达式(头歌实践教学平台习题)【合集】
这份文档详细介绍了编程任务的多个关卡,涵盖C语言的基础知识和应用。主要内容包括: 1. **目录**:列出所有关卡,如`print函数操作`、`转义字符使用`、`数的向上取整`等。 2. **各关卡的任务描述**:明确每关的具体编程任务,例如使用`printf`函数输出特定字符串、实现向上取整功能等。 3. **相关知识**:提供完成任务所需的背景知识,如格式化输出、算术运算符、关系运算符等。 4. **编程要求**:给出具体的代码编写提示。 5. **测试说明**:包含预期输入输出,帮助验证程序正确性。 6. 文档通过逐步引导学习者掌握C语言的基本语法和常用函数,适合初学者练习编程技能。
45 1
|
6月前
|
存储 安全 C语言
C语言中的数据类型
C语言中的数据类型
118 1
|
6月前
|
存储 C语言
C语言数据类型、变量和运算符以及printf相关问题
C语言数据类型、变量和运算符以及printf相关问题
|
2月前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
78 8
|
4月前
|
存储 C语言
【c语言】数据类型和变量
本文介绍了C语言中的数据类型和变量。数据类型分为内置类型和自定义类型,内置类型包括字符型、整型、浮点型等,每种类型有不同的内存大小和取值范围。变量分为全局变量和局部变量,它们在内存中的存储位置也有所不同,分别位于静态区和栈区。通过示例代码和图解,详细阐述了这些概念及其应用。
78 1
|
4月前
|
C语言
3.4 C语言基本数据类型2
在C语言中,声明一个整型(int)变量时,需先写入&#39;int&#39;关键字,后跟变量名并以分号结尾。若同时声明多个变量,可在&#39;int&#39;后用逗号分隔列出所有变量名。例如,`int erns;` 或 `int hogs, cows, goats;` 都是合法声明。变量声明后需通过赋值语句如 `cows = 112;` 或使用函数如 `scanf()` 来初始化其值。
83 10
|
4月前
|
存储 程序员 C语言
3.1 C语言基本数据类型
在C语言中,整数类型如`int`类型是很有用的,它属于有符号整型,意味着该类型的值必须是整数,并且可以是正整数、负整数或者零。`int`类型的数值范围依据计算机系统有所不同,通常取决于系统的位宽。例如,在早期16位的IBM PC兼容机上,`int`类型使用16位存储,取值范围为-32768至32767;而在当前32位系统中,使用32位存储,拥有更宽泛的取值范围。随着64位处理器的普及,`int`类型能够存储的整数范围将进一步扩大。根据ISO C标准,`int`类型的最小取值范围被规定为-32768到32767。系统通常会利用一个特殊的位来表示整数的正负。
91 10
|
4月前
|
C语言
3.1C语言基本数据类型
在C语言中,初始化变量是指为变量设定初始值,通常在声明时直接完成,例如 `int cows=32;`。应注意避免在同一语句中混合初始化与未初始化的变量,如 `int dogs, cats=94;` 这样的写法容易引起误解。此外,整型常量如21、32等在C语言中被视为int类型,但非常大的整数则不然,且带有小数点或指数的数值不属于整型常量。
43 9
|
5月前
|
存储 C语言 索引
C 语言数据类型详解
C语言中的数据类型主要包括基本数据类型、构造数据类型和用户定义数据类型。基本类型如整型(`int`)、字符型(`char`)、浮点型(`float`)、双精度浮点型(`double`)和无符号整型(`unsigned int`)。构造类型包括数组(`Array`)、结构体(`Struct`)、共用体(`Union`)和枚举(`Enum`)。用户定义类型则通过`typedef`为已有类型定义新名称,并可通过结构体和共用体自定义复合数据结构。此外,还有指针类型用于存储变量地址,以及`signed`、`unsigned`、`short`、`long`等类型修饰符。
134 11

热门文章

最新文章