- 有符号数signed可以存储负数,无符号数呢只能存储非负数
我们要考虑两个问题。
- 第一个问题是要存储的这个整数,它是一个多大的范围,比如说要存储一个五。还有比如说我可能要算个数65535,或者说我要算出一个数65536,可能这个数据本身比较小,也可能会比较大。那么,你在存储的时候,你可能会担心我的这个数据很大,那么我现有的这个类型存不存得下,这是一个要考虑的问题,那么,
- 另外一个问题是,当你去存储的时候,你说我的数据可能是个负数,我可能要存一个负五。也可能要存一个正五,那么当你的数据要存储正数或负数的时候,是不是也应该考虑我的这个类型能不能存储这种带符号的数?
- 那么,基于这样的两个原则,一个是范围,另一个是它的这个数据的正负这个角度。
基本数据类型
逻辑类型。只有两个量true和false,表示逻辑真值和逻辑假值。
整数类型。包括char, short, int和long。
浮点类型。包括float和double。
void类型。主要用于说明不返回值的函数或指向任一类型的指针等。
bool类型 需要引入<stdbool.h>头文件 _Bool基本类型
布尔实际上也是通过整型实现的
例如,
if ( -1 )
x=12 ;
else
x=18 ;
上面0.5是非零数值,逻辑值为真,所以x赋给的是12,而不是18。
在<stdbool.h>头文件中, true就是1, false就是0==;bool是一个宏。没有加头文件的时候报错,也是因为这些宏是在这个头文件加的,所以需要引入这个头文件==, 代码中遇到true和false就需要引入头文件, 因为true和false的宏是在<stdbool.h>头文件中定义的
- char类型
在 C 语言中,字符和整数之间的关联是非常强的,字符常量事实上是 int 类型而不是 char 类型(这 是一个非常有趣的现象,但对我们并无影响)。当计算中出现字符时,C 语言只是使用它对应的整数值。
10000000
是一个8位二进制补码数,首位是1,因此它是一个负数的补码表示。
在二进制补码中,我们需要将每一位乘以对应的权重,并将所有位的结果相加,得到十进制的表示。
1 * (-2^7) = -128
0 * 2^6 = 0
0 * 2^5 = 0
0 * 2^4 = 0
0 * 2^3 = 0
0 * 2^2 = 0
0 * 2^1 = 0
0 * 2^0 = 0
将所有位的结果相加:
-128 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 = -128
所以,10000000
对应的十进制数是 -128。
- 使用char数据类型的变量需要特别注意,防止数据超出值域,思考下列几个语句:
- 在 64 位操作系统中,
long
数据类型通常占 8 字节(64 位),也就是 64 位二进制数。- 在 32 位操作系统中,
long
数据类型通常占 4 字节(32 位),也就是 32 位二进制数。
char c1= 128; //出错,数据越界(-128)
char c1= 129; //出错,数据越界(-127)
unsigned char c2= -1; //出错,数据越界(255)
在计算机中,字符型数据是用来表示字符的数据类型,不直接表示整数,但在内部存储时,字符型数据实际上被表示为整数。
计算机使用编码表,如ASCII(美国标准信息交换码)或Unicode,将字符映射为相应的整数值。在ASCII编码中,每个字符都与一个唯一的整数值(0到127)相关联,表示为一个8位的二进制数。
当在计算机中处理字符型数据时,实际上是在处理对应的整数值。对于有无符号的整数字符型数据,计算机并不直接知道该字符是有符号还是无符号,它只知道对应的整数值。在计算机内部,字符型数据的整数值不区分有符号和无符号,都以二进制形式存储。
当我们从程序中获取字符型数据并进行处理时,我们需要根据编码规则(如ASCII)将整数值解释为字符或相应的含义。对于字符型数据,通常由程序员来处理,根据具体的需求来解释字符的含义,并决定是否按照有符号或无符号来处理整数值。在C语言等编程语言中,我们可以通过声明字符型数据为char
类型来处理字符型数据。根据C语言的规范,char
类型既可以被视为有符号也可以被视为无符号,这取决于编译器的实现和计算机的体系结构。
总结来说,计算机内部对字符型数据实际上是以整数形式表示的,但是否有符号取决于具体的数据解释和计算机的体系结构。程序员在处理字符型数据时需要注意如何解释整数值,以确保正确地处理字符和相应的含义。
在实际使用中,为了避免混淆,最好在代码中明确指定char类型的有无符号性,或者使用更明确的整数类型(如int、unsigned char等),以确保正确地处理字符型数据。
-
•short类型<limits.h>
-
int类型
-
long类型
4G的空间为4294967296字节
- 浮点类型
Tips:特别大的数或特别小的数简易用浮点型的指数形势。
-
强制数据类型转换
-
强制数据类型的转换是指采用某种方式将某种数据类型强制转换成指定的数据类型。包括显式的数据类型转换,和隐式的数据类型转换。
-
例如,
-
int a=22, b=0 ;
-
float c = 24.87, d= 3.3;
-
b = (int) (a + c +d) ; // b为50
-
-
强制类型转换符后面的表达式如存在复杂运算,就一定要用小括号括起来
-
强制类型转换符是一种不安全的转换,一般都是将高级类型转换成低级类型,要丢失数据的精度;
-
强制类型转换并不改变表达式中变量的数据类型和其值。
总结与思考
主要介绍了数据类型,包括分类、基本类型介绍、强制类型转换。
思考:
- C语言中包括哪些数据类型?
答:整型、字符型、实型、枚举型、数组、结构体、共用体、指针类型、空类型
- 如何做强制类型转换?
- 答:在C语言中,可以使用强制类型转换符(类型名)来进行强制类型转换。强制类型转换的基本格式如下:
(目标数据类型) 表达式
其中,目标数据类型是希望将表达式转换成的数据类型,表达式是需要转换的数据。需要注意以下几点:
-
强制类型转换符是一对小括号,将目标数据类型放在括号内。
-
强制类型转换符后面的表达式如果存在复杂运算,应该用小括号括起来,以确保转换的顺序正确。
-
强制类型转换通常用于将高级类型转换成低级类型,可能会丢失数据的精度。因此,在进行强制类型转换时,应该谨慎考虑是否会导致数据精度丢失。
-
强制类型转换并不改变表达式中变量的数据类型和其值,只是在使用该表达式时按照目标数据类型进行解释。
以下是几个示例:
int a = 22, b = 0;
float c = 24.87, d = 3.3;
b = (int)(a + c + d); // b为50,将浮点数和整数相加后强制转换为整数类型
float pi = 3.14159;
int approximatePi = (int)pi; // approximatePi为3,将浮点数pi强制转换为整数类型
在进行强制类型转换时,需要根据实际情况仔细考虑数据类型的选择,以确保程序运行正确并得到预期的结果。