乐趣区

关于c:C入门数据类型

Summary

0)对于所操作数据的具体类型,肯定要十分明确!

1)C 语言对数据的分类:整数类型、浮点数类型、字符类型(一般字符型、无回显字符型)。各个类型的基本区别在于,所占用的内存大小不同。

2)类型所占的字节数是由编译器决定的,32 位和 64 位的次要区别在于:指针所占字节数别离为 4 和 8;long 所占字节数别离为 4 和 8。

3)辨别初始化和赋值的关键点:赋值操作是在创立变量时候进行的,还是在创立变量之后进行的。

4)当遇到以下 2 种状况时:

  • 以后的值曾经溢出了(超过了以后类型所能示意的范畴里的数)
  • 大类型向小类型转换
    对于溢出当前的值
    正值:溢出的值 – 以后类型能示意的个数 = 理论值
    负值:溢出的值 – 以后类型能示意的个数 = 理论值

5)sizeof 用于取得类型或者变量所占用的内存字节数,sizeof 作用于 数组名 时,能够失去数组占用的内存。

6)C 语言中字面量的默认类型:如 2 为 int,0.2 为 double,’2’ 为 char

1、数据类型与变量

1.1 C 语言中的数据类型

初学阶段应把握的类型:
整形:

  • int:占用 4 个字节(32 位(bit)),示意范畴:-2147483648~2147483647(-231 ~ 231-1)。
  • short:占用 2 个字节(16 位(bit)),示意范畴:-32678 ~ 32767。

浮点型:

  • float:占用 4 个字节(32 位(bit)),示意范畴:-3.4 x 1038 ~ 3.4 x 1038
  • double:占用 8 个字节(64 位(bit)),示意范畴:-1.7 x 10-308 ~ 3.4 x 10308

字符型:

  • char:占用 1 个字节内存(8 位 (bit)),示意范畴:-128~127。字符数据应用单引号括起来。包含一般字符(英文字符类型,如 ’D’,’t’); 无回显字符类型( 无回显字符 必须以反斜杠 ’\’ 结尾,是一种打印后在屏幕上看不到的字符,如换行符 ’\n’, 制表符 ’\t’,这 是一个字符 );字符类型理论也是种 整型

各个数据类型的基本区别在于,所示意的内存大小不同。

1.2 C 语言中变量的命名规定

  • 字母(a-z, A-Z)、数字(0-9)、下划线(_)形成的字符序列
  • 第一个字符必须为字符或者下划线(不能为数字)
  • 大小写敏感(如 name 和 Name 是两个不同的变量名字)

// 小测试:以下哪些命名是非法的?()A.WORD        B.-abc        C.2c    D._1
E.m_test    F.a@b        G.c3    H._

// A、D、E、G、H 非法

变量命名的标准:
1)见名知义:变量命名肯定要一眼能看出这个变量的用处
2)便于浏览:能够遵循一些标准,如“驼峰标准”,不便本人和别人浏览、保护代码。

1.3 C 语言中变量的定义

C 语言中创立变量的语法:type name;

如下:int n1;
double n2;
short n3;

初始化:在创立变量的 同时 ,给变量一个值。
赋值:在创立变量 之后,扭转变量的值。

int n1;            // 定义变量,名为 n1,类型为 int
double hello;      // 定义变量,名为 hello,类型为 double

int n2 = 2;        // 定义变量,名为 n2,类型为 int,并初始化为 2

n1 = 1;            // 赋值操作,扭转 n1 的值,使其示意 1 

2、深刻数据类型与变量

2.1 程序中数值的类型

C 语言是类型严格的语言,字面量也有类型,应用字面量时也须要思考字面量的类型。字面量的类型包含默认类型和指定类型,如:

  • 默认类型:2 为 int,0.2 为 double,’c’ 为 char
  • 指定类型:0.2f 为 float(后缀 f 示意 float)

每种类型都有本人的容量(所占内存的大小),如果将大类型的值赛道小类型的容器内,可能放不进,会溢出。

大类型赋值给小类型时,可能产生溢出:

  • 当数值在小类型范畴内 –> 赋值胜利
  • 当数值超过小类型的范畴 –> 产生溢出

小类型能够平安的赋值给大类型:

  • 浮点型赋值给整形,会产生截断 –> 小数局部失落
  • 整形赋值给浮点类型 –> 赋值胜利
int a = 50000;    // valid:50000 是一个字面量,默认类型为 int,在 int 能示意的范畴内

short b = 0;    // 0 是一个字面量,默认类型为 int,int 到 short 类型的转换,可能出问题。// 实际上 0 在 b 能示意的范畴内,所以能失常赋值

b = a;            // oops!赋值操作,扭转 b 的值为 int 类型的 50000,超过了 b 能示意的范畴,坏了

// 输入:b = -15536。为何是该值,见 summary

2.2 类型转换

C 语言中不同类型的变量之间(变量与字面量之间)进行赋值或运算时,会产生类型转换。类型转换不扭转原变量的值,仅仅是被赋值的变量的值产生扭转,并且可能会不失常。

开发小常识:

  • 开发环境(编译软件)由编辑器和编译器组成
    • 编辑器:负责程序的编写工作(字处理软件)
    • 编译器:负责程序的编译工作(文本转为二进制)
  • C 语言编译器查看类型的同时,可能做 默认转换
    • short s = 2; // 字面量 2,类型为 int,被转换为 short
    • double d = 2; // 字面量 2,类型为 int,被转换为 double

默认类型转换 :编译器晓得字面量 2 的类型是 int,但也明确的晓得初始化操作能够胜利(因为 2 在 short 能够示意的范畴内),因而编译器就会悄悄的将 2 的 int 转换为 short。
强制类型转换:也叫强制类型转换。规定:type name =(type)var;

int i = 40000;
short b = (short)i;

printf("i = %d\n", i);  // i = 40000
printf("b = %d\n", b);  // b = -25536

以上代码也验证了,类型转换不会扭转原来变量的值,只是扭转被赋值变量的值,且可能会产生异样(如 b 冀望是 40000,但理论输入是 -25536,起因见 summary4))。

3、再论数据类型

3.1 如果值超过了类型所能示意的最大范畴该怎么办

代码见 2.2。40000 超过了 short 能示意的范畴,这时候示意的值是个奇怪的值。论断如下:

* 当遇到以下 2 种状况时 :*
1)以后的值曾经溢出了(超过了以后类型所能示意的范畴里的数)
2)大类型向小类型转换
对于溢出当前的值
正值:溢出的值 – 以后类型能示意的个数 = 理论值
负值:溢出的值 – 以后类型能示意的个数 = 理论值

代码剖析:

short b = 40000;    // output: -25536

// 40000 是溢出后的值(正值);short 类型占用内存 16bit,能示意 2^16 个数;// 理论值 = 40000 - 2^16 = 40000 - 65536 == -25536

unsigned short s = 0;
s = s - 1;            // output: 65535
// - 1 是溢出后的值(负值);short 类型占用内存 16bit,能示意 2^16 个数;// 理论值 = -1 + 65536 = 65535

最初:程序运行时如果产生了越界:

  • 大于类型最大值,则:运行后果回转到最小值左近
  • 小于类型最小值,则:运行后果回转到最大值左近

3.2 sizeof 关键字

sizeof 用于获取类型或者变量所占用的内存大小(字节)
用法:
sizeof(type)
sizeof(variable)
sizeof variable // 此种形式并不为工程中罕用

int var = 1;

printf("%d\n", sizeof(var)); // 4
printf("%d\n", sizeof(int)); // 4
printf("%d\n", sizeof var); // 4

3.3 补充常识

1)整型 的扩大常识:
signed 和 unsigned 能够与 char、short、int 组合应用

惯例写法 残缺写法 示意的数据范畴
char signed char -128~127
unsigned char unsigned char 0~255
short signed short -32768~32767
unsigned short unsigned short 0~65535
int signed int -2147483648~2147483647
unsigned int unsigned int 0~4294967295

2)对于打印输出,不同的类型值,要具体对应应用不同的格式化字符

类型 对应的格式化字符 占用内存
int %d 4
unsigned int %u 4,(有无符号不影响占用的内存)
short %d 2
char %c, %d 1
long %ld 4 / 8, 别离对应 32 位和 64 位编译器
long long %lld 8
float %f 4
double %f 8

如果应用了不匹配的格式化字符,输入则可能有问题:

// eg.1
unsigned int u = 2147483648;
printf("u = %d\n", u);  // -2147483648

printf("u = %u\n", u);  // 2147483648

//eg.2
unsigned char c = 128;
printf("c = %d\n", c);  // 128

例 1 中,为什么 2147483648 在 unsigned int 示意的范畴内,第一次输入还是不对?
起因在于 ,%d 格式化字符是针对有符号整型的,所以此时将 u 看做一个 int,利用 summary4) 的计算方法,的确输入了 -2147483648。如果依照正确的输入形式 %u,则输入的是期望值 2147483648。

例 2 中,unsigned char c 的值是 128,也是以 %d 的形式进行打印输出,此时 128 超过了 signed char 能示意的范畴,为什么不像例 1 中打印出错呢?
起因在于,128 这个值太小了,如果小于 signed int 能示意的最大值(2147483647),以 %d 形式打印就不会出错;如果大于了 2147483647,那么 %d 打印就会出错了。

所以,数据什么样的类型,就严格用对应的格式化字符去匹配

3)左值和右值
左值:能够呈现在赋值符号右边的值,如:变量
右值:呈现在赋值符号左边的值,如:变量、字面量、计算结果(为右值)

4)数据的示意(简略,见后续 C 进阶课程)
浮点类型(float&double)对数据的示意是不精确的
整数类型(char,short,int,long)对数据的示意是精确的
浮点类型与整数类型在内存中对数据的 表示法齐全不同

本文总结自“狄泰软件学院”唐佐林老师《C 语言入门课程》。
如有错漏之处,恳请斧正。

退出移动版