04-数据类型

  1. 整形:

概念:表示整数类型的数据

语法:

int a = 123;

注意:

  • 整形在32位系统或64位系统中都占用4字节
  • 取值范围

$ getconf INT_MAX

2147483647

$ getconf INT_MIN

‐2147483648

整形的修饰符:

short     短整型,用于修饰整型的尺寸变为原本的一半,减少内存的开支,缩小取值范围

long      长整型 , 用于修饰整型的尺寸使其尺寸变大(取决与系统), 增加内存开支, 扩大取值范围。

long long   长长整型 ,用于修饰整型的尺寸使其尺寸变大(取决与系统), 增加内存开支, 扩大取值范围 (在64位系统中 long 与 long long的大小一致)

unsigned 无符号整型  , 用来修饰整型并去掉符号位,使得整型数据没有负数,可以提正整数的取值范围 (0 - 4294967295)

整型数据在二进制存储时最高位(第31位)表示符号位,如果为1 则表示负数,0则表示正数。

整数的存储方式:

原码: 正整数是直接使用原码进行存储的,比如100这个正整数,则直接把100 转换成二进制直接存储。

100  -->  0000 0000   0000 0000  0000 0000   0110   0100

补码:负数则是使用补码来存储, 补码 = 原码的绝对值 取反+ 1取反加1时符号位不变 

比如 -100 :100  -->  1000 0000   0000 0000  0000 0000   0110   0100

取反->  1111 1111   1111 1111  1111 1111  1001   1011

加1 -->  1111 1111   1111 1111  1111 1111  1001   1100

溢出:

当超过取值范围时则会编程相邻的最小值/最大值。

整形输出:

int c = 100;

printf("十六进制:%#x\n" , c );

printf("十进制:%d\n" , c );

printf("八进制:%#o\n" , c ); // 输出结果

十六进制:0x64

十进制:100

八进制:0144

sizeof运算符,用于计算 变量/类型 的大小。

int a = 123 ; sizeof(int); sizeof(a); //注意括号内部可以写变量类型, 也可以写变量名

  1. 浮点型(实型):

概念:用来表达一个实数的数据类型分类:

  • 单精度浮点型  float , 典型尺寸  4 字节 
  • 双精度浮点型  double , 典型尺寸  8 字节
  • 长双精度 long   double , 典型尺寸  16  字节 占用的内存越多则 精度越高。

浮点数的存储:

IEEE 浮点标准采用如下形式来表示一个浮点

注意:

float f = 3.14; // 浮点数3.14 通过以上公式计算得到的二进制码被存放与内存f中 printf("f:%f\n" , f ); // 使用浮点的计算方法来解析内存f中的值(二进制) printf("d:%d\n" , f );// 直接使用整型的计算方法来直接解析内存f 中的值 (二进制)

所有的数据都会被转换成二进制进行存储,如果想到的到正确的数据,必须使用正确的理解方式(类型),来解析二进制数据。

  1. 字符类型

char c = 'k';

1. 申请一片内存并且命名为 c

2. 确定内存的大小为 char  (1字节)

3. 把字符‘K’的ASCII码值转换为二进制,并存储到该内存中

计算机中存储的所有数据都是以二进制的形式存在的, 因此字符必须映射某一个数字才能够被存放到计算机中,这个映射的表就成为 ASCII 表,可以使用man手册来查看(在ubuntu下):

char c = '1' ;

printf("字符:%c\n",c); // 以字符的形式来解析内存 c 的内容得到 对应的字符 1

printf("整型ASCII值:%d\n",c); //以十进制整型来解析内存c 的内容 ,得到1多对应的ASCII值

注意:字符实质上是一个单字节的整型,因此支持所有整型的操作

char k = 'H' ;

printf("%c\n" , k + 1 );

printf("%c\n" , k ‐ 1 );

  1. 字符串

字符串的表现形式有两种:

形式一:  数组(可读 ,可写):(存储)

char s1 []= "Hello" ; //使用一个数组来存放字符串 "Hello"

形式二:  指针 (只读):(指向)

char * s2 = "Even"; // 使用一个指针来指向常量字符串

char s1[] = "Hello";

char *s2 = "Even";

printf("%s %s\n" , s1 , s2 );

  1. 布尔类型:

概念:布尔类型用来表示真假(非0即真)

真:true

假:false

注意在使用布尔类型是需要包含他的头文件

bool a = 1;// 真

bool a = 0;// 假

bool a = true; // 真

bool a = false; // 假

一般布尔类型的变量,可以用于逻辑判断比如if/while,或用于函数的返回值。

布尔类型的大小是多少?

常量与变量 :

概念:不可以被改变的内存,被称为常量。可以改变的内存,被称为变量量。

int a = 100; // a是一个变量,而100为常量。

float b = 3.1415; // f是一个变量,而3.1415为常量。

char s1[] = "abcdefg" ; // s1 是一个变量 , 而"abcdefg" 则是常量 (字符串常量)

常量类型:

100   : 整型常量

100L :   长整型 long 

100LL : 长长整型long long

100UL : 无符号的长整型  unsigned long 

3.14   : 编译器默认升级为双精度浮点型

3.14L : 长的双精度浮点型

 'a'  : 字符常量

"Hello"  : 字符串常量(指针 char  * )

标准输入:

概念:  标准输入一般指的是键盘的设备文件, 从键盘获取数据就成为标准输入。

scanf( ); // 扫描键盘 (格式化输入数据 ‐‐> 从键盘中获得指定类型的数据)

头文件:

#include

函数原型: int scanf(const char *format, ...);

参数分析: format ‐‐> 格式化

... ‐‐> 省略号 , 根据format 所写的格式控制符,对应一个内存地址

返回值:

成功 返回具体获取到的项目数

失败 返回0

getchar( ) ; // 获取一个字符 (默认从标准输入文件中获取)

函数原型:

int getchar(void);

参数: 无

返回值: 成功 返回一个ASCII值, 代表获得的字符 (unsigned char )

失败 返回 EOF 也就是-1

实例:

int main()

{

int num = 0;

char c = '0'; // & 取地址符号 , 获得 内存 num 的地址

int ret_val = scanf("%d", &num );

while(getchar() != '\n'); // 清空 由 scanf 所留在缓冲区的内容 ,如果不清空有可能会导致下一次使用标准输入缓冲区异常(有上一次的数据没有被读取)

printf("返回值:%d , 获取的数据为:%d\n" , ret_val , num );

ret_val = scanf("%c", &c ); while(getchar() != '\n'); // 清空 由 scanf 所留在缓冲区的内容

printf("返回值:%d , 获取的数据为:%c\n" , ret_val , c );

printf("EOF:%d\n" , EOF ); //EOF 实际上是一个值为‐1 的宏 return 0 ; }

注意: 如果以后需要从标准输入中获取数据得到乱码或未知数据,则可以尝试使用getchar 进行清空再 获取