作者:余小小
日期:2021-10-02
有符号和无符号
相对于二进制数值考虑
-
有符号,则可以定义负数,这个符号可以简单的理解成负号,但是真的意义是指的是符号位的具体数值
-
在二进制中,最高位是符号位,也就是最左边的的值
-
如果是0,则是正数,如果是1则是负数
两个关键词:
-
符号:signed,sign:记号,标记,ed,名词后缀,那么则是有符号的,signed
-
无符号:unsigned,un:否定前缀,则是无符号的.
在c语言中中,所有的数值类型,都是默认的有符号的数据类型,也就是说默认都是有signed关键词修饰的
整数类型
参考:
类型 | 存储大小 | 值范围 |
---|---|---|
char | 1 字节 | -128 到 127 或 0 到 255 |
unsigned char | 1 字节 | 0 到 255 |
signed char | 1 字节 | |
int | 2 或 4 字节 | -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647 |
unsigned int | 2 或 4 字节 | 0 到 65,535 或 0 到 4,294,967,295 |
short | 2 字节 | -32,768 到 32,767 |
unsigned short | 2 字节 | 0 到 65,535 |
long | 4 字节 | -2,147,483,648 到 2,147,483,647 |
unsigned long | 4 字节 | 0 到 4,294,967,295 |
注意,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主
重点明白,c语言中是可以定义负数的
浮点类型
数据类型 | 占用大小 |
---|---|
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 位小数 |
之前了解过浮点类型,这里补充一下需要注意的地方:
-
在c语言中小数常量默认为double型在内存中存储
-
为了区分是float还是double,在定义的小数后面使用相关的字符来区分,比如float的后缀f,int a =1.1f;
相关的占位符:
-
浮点数的占位符:%f,
-
float和double在printf中都是使用的%f来占位
-
如果需要精确到某个精度范围,那么参考:%.2f(小数后两位),也可以%0.2f,但是一般都是省略0
-
在后面将要接触到的scanf中,浮点数的占位符号是:%lf
根据”默认参数提升”规则(在printf这样的函数的可变参数列表中 ,不论作用域内有没有原型,都适用这一规则)float型会被提升为double型。因此printf()只会看到双精度数。
对于scanf,情况就完全不同了,它接受指针,这里没有类似的类型提升。(通过指针)向float存储和向double存储大不一样,因此,scanf区别%f和%lf。
C中的字符串
字符串在c是特殊的存在,那么字符串是啥类型呢
从图中查看,并没有看到有字符串字样,那么,为何c语言在printf中还是的有%s的占位符,来给String字符串使用呢
第一个原因:字符串的使用量是最大的,也就是在实际的编程中,频繁使用到字符串
第二个原因:c语言在创建数据类型的时候,考虑到字符串所占用的内存空间比较大,所以底层使用的数组来实现字符串
所以,字符串就是数组,进一步的说,字符串是字符数组,所以,字符串是属于构造类型中的一种,且是数组
关于数组 ,后面详细解释
C中的“布尔类型”
在C语言里,是没有bool类型的,所以 C 语言判断真假时以 0 为假,非 0 为真(一般用1)。
C99 提供了 Bool 型,所以布尔类型可以声明为 _Bool flag。 _Bool 依然仍是整数类型,但与一般整型不同的是,Bool 变量只能赋值为 0 或 1,非 0 的值都会被存储为 1。 C99还提供了一个头文件 <stdbool.h> 定义了 bool 代表 _Bool,true 代表 1,false 代表 0。 只要导入 stdbool.h ,就能非常方便的操作布尔类型了
#include <stdio.h>
//导入 stdbool.h 来使用布尔类型
#include <stdbool.h>
//计算n!,n的值在main中定义
int main ()
{
int n = 10; //计算叠乘数
int sum = 1; //用来存放叠乘的结果
bool flag = false; //叠乘标记
int num = n; //循环次数
while( !flag )
{
sum = sum * (num--);
//当num=1时结束循环
if( num == 1)
{
flag = true;
}
}
printf ("%d的叠乘值为 %d \n", n, sum);
return 0;
}
暂无评论内容