C语言数据类型,变量的输入和输出,进制转换

英语:

Byte:字节

Word:字,4字节

Half Word:半字,2字节

Double Word:双字,8字节

//Half Half Word:半半字,1字节

rollback:回滚:从哪里来滚回哪里去

回顾:

1.linux系统的命令

clear/ pwd/ cd/ ls - lh/ touch/ mkdir -p/ rm -fr/cp -fr/ mv -fr/ cat/

echco 配合>, >>/ find/ grep/ whoami/ tar/

2.vim编译器

  vim三种模式

  模式切换

  命令行模式的命令

  可视模式的快捷键


3.C语言编程规范

  文件

源文件.c

头文件.h

  注释

/* */ 多行,不能嵌套

// 可以嵌套,不能多行

主函数main

int main(void){

...

}

printf

标准C库函数:大神写好的,直接使用

添加stdio.h头文件

printf("输出信息"):光标还在本行停留

printf("输出信息\n");光标会跑到下一行

占位符:printf("输出信息%d\n",数字或者变量);

4.gcc编译器

  翻译官:源文件->可执行文件

  翻译三步骤:

预处理:gcc -E -o xxx.i xxx.c

只编译不链接:gcc -c -o xxx.o xxx.i

链接:gcc -o xxx xxx.o

  编译的三种方式:

流氓法,分步法,一步到位

5.C语言的变量

  概念:

内存:程序最终玩内存

字节:Byte

地址:Address

存储区:Buffer

首地址:base address

切记:1.只要知道了内存地址,就可以对内存进行读数据或者写数据

  2.要想访问内存,必须提前分配获取到你内存,不能不分配直接访问,否则程序崩溃

Q:如何分配内存呢?

A:通过定义变量

  a)定义变量语法:

数据类型 变量名 = 初始值;

例如:int a = 250; 此时此刻脑子务必浮现一个内存示意图

后续可以通过 "=" 给变量赋值(本质就是修改内存里面的数字)

如果不初始化,也就是不给初始值,gcc编译器会给一个随机乱七八糟的数

  b)标识符命名规则

  c)C语言基本编程风格

---------------------------------------------------------------------------------------------------------------

  d)详解定义变量时的数据类型

1.数据类型功能:让gcc编译器预算出将来这个变量要分配的内存大小

2.12类基本数据类型如下:

关键字名称 含义 分配内存大小 包含数字的范围

char 字符类型(本质是单字节整数) 1字节 -128 ~ 127

unsigned char 非负单字节整数 1字节 0~255

short 双字节整数 2字节 32768 ~ 32767

unsigned short 非负双字节整数 2字节 0 ~ 65535

int 四字节整数 4字节 -2^31 ~ 2^31-1

unsigned int 非负四字节整数 4字节 0 ~ 2^32-1

long 四字节(32位)八字节(64位)整数 4/8字节 -2^63 ~ 2^63-1

unsigned long 非负四字节(32位)八字节(64位)整数 4/8字节 0 ~ 2^64-1

long long 八字节整数 8字节 略(过大)

unsigned long long 非负八字节整数 8字节 略

float 单精度浮点数 4字节 略

double 双精度浮点数 8字节 略

应用:

char a = 1; //分配1字节内存

short a = 1; //分配2字节内存

unsigned int a //分配4字节内存

long a = 1; //分配4字节/8字节内存

unsigned long long a = 1; //分配8字节内存

double a = 1.1; //分配8字节内部才能

3.切记:unsigned int 和unsigned long对于gcc编译器来说不一样:

  对于32位系统/64位系统,usigned int 都是4字节

  对于32位系统,unsigned long 同样是4字节

  对于64位系统,unsigned long 是8字节

  将来后续课程讲指针高级用法,用得着!

4.每种数据类型都有 有符号和无符号

  1.有符号数字有正负之分,无需添加关键字unsigned,但是可以加或者不加signed关键字

  例如:int a = -10; 等价于 signed int a = -10;


  2.无符号数字(非负)只有0和正数,必须添加unsigned关键字

  例如:unsigned int a = 10;

  e)利用sizeof关键字可以获取变量或者数据类型将来分配的内存大小

语法:内存大小 = sizeof(变量名或者数据类型关键字名);

例如:

long long a = 1;

printf("%d %d\n",sizeof(a),sizeof(long long));

切记:sizeof圆括号里面如果对变量进行修改赋值操作,此操作是无效的

案例:利用sizeof求变量或者数据类型分配内存大小

实施步骤:

mkdir /home/tarena/stdc/day03

cd /home/tarena/stdc/day03

vim sizeof.c

gcc -o sizeof sizeof.c

./sizeof

//参考代码

/*sizeof演示*/

#include <stdio.h>

int main(void){

char a = 1;

unsigned char b = 2;

printf("sizeof(a) = %d,sizeof(char) = %d\n",sizeof(a),sizeof(char));

printf("sizeof(b) = %d,sizeof(unsigned char) = %d\n",sizeof(b),sizeof(unsigned char));

short c = 3;

unsigned short d = 4;

printf("sizeof(c) = %d,sizeof(short) = %d\n",sizeof(c),sizeof(short));

printf("sizeof(d) = %d,sizeof(unsigned short) = %d\n",sizeof(d),sizeof(unsigned short));

int e = 5;

unsigned int f = 6;

printf("sizeof(e) = %d,sizeof(int) = %d\n",sizeof(e),sizeof(int));

printf("sizeof(f) = %d,sizeof(unsigned int) = %d\n",sizeof(f),sizeof(unsigned int));

double g = 1.1;

printf("sizeof(g) = %lf,sizeof(double) = %lf\n",sizeof(g),sizeof(double));

//自行添加:long/unsigned long, long long/unsigned long long, float

//以下操作无法修改变量值

int i = 250;

sizeof(i = 300);

printf("i = %d\n",i);

return 0;

}

  f)细说基本数据类型只字符类型char

1.字符常量概念:用单引号括起来表示,其值固定不变,不可修改

例如:'A', 'a', '1'等

2.字符常量(用char或者unsigned char 定义的变量)存储的数据本质

  就是一个字符常量对应的整数,这个整数专业术语叫ASCII码

  例如:

  char a = 'A'; //表面看是分配1字节内存,并且里面放了一个字符常量'A'

  这样理解是错误的!

  本质是分配1字节内存空间,并且内存里面放了一个字符常量'A'

  的ASCII码65(就是一个整数)

ASCII码和字符常量的对应关系:

给人看的 给计算机看的

类似中文你好 类似英文hello

字符常量 ASCII码

'A' 65

'B' 66

...

'a' 97

'b' 98

...

'1' 49

'2' 50

所以:'d' - 'a' = 本质是100 - 97 = 3

3.字符变量打印输出的占位符:%c(按字符常量形式显示)和%d(按整数ASCII码形式显示)

  例如:

  char = 'A';

  printf("%c,%d\n",a,a); //A,65


  案例:演练字符类型

  参考代码:char.c


4.转义字符

'\n':让光标移动到下一行的行首

'\r':让光标移动到当前行的行首

'\t':输出一个TAB键

'\\':得到一个\

'\'':得到一个'

'\"':得到一个"

'%%':得到一个%%

案例:利用printf输出以下信息

abc

def\efg'mn"ijk%

代码参考:printf("abc\n\tdef\\efg\'mn\"ijk%%\n");

  g)细说基本数据类型之整数类型

1.整形数据类型的关键字:int

  可以用short,unsigned short,long,unsigned long进行修饰

  所以int可以代表2字节或者4字节


2.int类型的六种形式:

形式1:short(int):分配2字节,有符号

  short a = 250;

  等价于

  short int a = 250;

形式2:unsigned short (int);分配2字节,无符号

  unsigned short a = 250;

  等价于

  unsigned short int a = 250;

形式3:long(int):分配4字节,有符号

  long a = 250;

  等价于

  long int a = 250;

形式4:unsigned long(int ):分配4字节,无符号

  unsigned long a = 250;

  等价于

  unsigned long int a = 250;

形式5:int:分配4字节,有符号

  int a = 250;

形式6:unsigned int:分配4字节,无符号

  unsigned int a  = 250;


3.整数常数(高手)

  100:gcc编译器默认当成int类型

  100L:gcc编译器默认当成long类型

  100LL:gcc编译器默认当成long long类型

  100u:gcc编译器默认当成unsigned类型

  100UL:gcc编译器默认当成unsigned long类型


Q:虽然类型不一样,都是数值100的常数,有何用?

A:这个知识点将来用于数据类型之间的转换使用,后续课程再使用!

  h)细说浮点数:float和double

1.23:gcc编译器把它当double类型

1.23f:gcc编译器把它当float类型

注意:浮点数在计算机中是一个无限趋近的近似值

例如:1.230000001是无限趋近1.23的值

  i)数据类型的对应的占位符(给printf函数使用)

数据类型 占位符

int %d

char %c,%hhd

unsigned char %c,%hhu

short %hd

unsigned short %hu

int %d

unsigned int %u

long %ld

unsigned long %lu

long long %lld

unsigned long long %llu

float %f或者%g

double %lf或者%lg

注意:前者保留多余的0,后者不会保留

例如:2.3 ---> %f/%lf ---> 2.300000

  2.3 ---> %g/%lg ---> 2.3

参考代码:vim type.c

/*数据类型和占位符演示*/

#include <stdio.h>

int main(void){

char a = 97;'

unsigned b = 'A';

printf("%c,%hhd\n",a,a);

printf("%c,%hhu\n",b,b);

short c = 250;

unsigned short d = 251;

printf("%hd,%hu\n",c,d);

int e = 252;

unsigned int f = 253;

printf("%d,%u\n",e,f);

long g = 254;

unsigned long h = 255;

printf("%ld,%lu\n",g,h);

float i = 2.3;

double j = 3.2;

printf("%f,%lf\n",i,j);

printf("%g,%lg\n",i,j);

return 0;

}

注意:回滚现象,参考代码:type2.c

代码演示:

#include <stdio.h>

int main(void){

//char:-128~127

printf("%hhd\n",~128);

printf("%hhd\n",127);

printf("%hhd\n",128); //回滚到-128

printf("%hhd\n",129); //回滚到-127

printf("%hhd\n",255); //回滚到-1

printf("%d\n",255); //正常,不会回滚

//unsigned char:0~255

printf("%hhu\n",255);

printf("%hhu\n",256); //回滚到0

printf("%d\n",256); //正常,不会回滚

return 0;

}

------------------------------------------------------------------------------------------

第四课:进制转换

1.明确:计算机中数字都是在内存中进行存储,并且这些数字都是以二进制的形式存储

2.明确:计算机软件代码中数字的表示形式(展现形式)有四种:

二进制表示,八进制表示,十进制表示,十六进制表示

注意:不管是哪种形式,都是对同一个内存中存储的数字的不通表示形式而已

内存中的数字不会因为表示形式不一样而数字发生改变

也就是内存中数字的值不会随着进制的改变而改变,内存中都是二进制形式!

类比:人(数字)

  在家(二进制形式)

  在公司(十进制形式)

  在超市(十六进制形式)

  人不管在哪里,本身是不会改变的!

  八进制,十进制,十六进制给程序员看的,好看

  二进制给计算机看,计算机只认二进制

3.明确:计算机把内存中每个字节又分8段,每段只能记录0和1

要想把一个数字存储到内存中,必须将这个数字分拆成若干个0和1存储到每个段中

每段对应的专业术语叫bit或者bit位

内存中的最小存储单元是为(bit)

结论:1Byte = 8bit

  2Byte = 16bit

  4Byte = 32bit

  8Byte = 64bit

例如:char a = 'A'; //分配1字节内存空间,把字符A的ASCII码65分拆成8个0和1(需要8位)存储到内存中即可

  short a = 250; //分配2字节内存空间,把250分拆成16个0和1(需要16位)存储到内存中即可

  int a = 250; //分配4字节内存空间,把250分拆成32个0和1(需要32位)存储到内存中即可

4.二进制

a)定义:用一组0和1表示数字的方法简称二进制表示形式

例如:现在有一个十进制数85(前提是char类型),要存储到内存中,必须以二进制的形式存储

所以需要将85分拆成8个0和1,最终其二进制表示形式为:01010101(二进制形式)

b)特点:

1.二进制数的编号:从0开始

  例如:前提是char类型(需要1字节)

  高位 低位

  76543210 二进制数的编号

  01010101 二进制数

  例如:前提是char类型(需要2字节)

  高位 低位

  15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 二进制数编号

  0  1  0  1  0  1  0 1 0 1 0 1 0 1 0 1 二进制数


2.二进制数中每个1单独代表一个10进制数字,这个10进制数字值是2的编号次方

  例如:前提是char类型

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容