网易云课堂_C语言程序设计进阶_第一周:数据类型:整数类型、浮点类型、枚举类型

C语言程序设计进阶_第一周:数据类型:整数类型、浮点类型、枚举类型

1.0数据类型

1.1整数类型

1.2浮点类型

1.3逻辑类型

1.4类型转换和条件运算

1.0数据类型

1 整数

char(%c), short, int(%d), long(%ld), long long(C99)

2 浮点数

float(%f), double(%lf), long double(C99)

3 逻辑

bool(C99)

4 指针

5 自定义类型

所表达的数的范围:char<short<int<float<double

sizeof是静态运算符,它的结果在编译时刻就决定了

不要在sizeof的括号里做运算,这些运算不会做的

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include<stdio.h>
 4 
 5 main()
 6 {
 7     int a = 6;
 8 
 9     printf("sizeof(int)=%d
", sizeof(int));
10 
11     printf("sizeof(a)=%d
", sizeof(a++));//sizeof是静态运算符,它的结果在编译时刻就决定了
12     //不要在sizeof的括号里做运算,这些运算不会做的
13     
14     printf("a=%d
", a);//仍然是6
15 
16     printf("sizeof(a)=%d
", sizeof(a + 1.0));//8,变成double
17 
18     printf("a=%d
", a);//仍然是6
19 
20     system("pause");
21 }

1.1整数类型

整数

char:1字节,8比特:-128~127

short:2字节:-32768~32767

int:取决于编译器CPU,通常的意义是1个字

long:取决于编译器CPU,通常的意义是1个字

long long:8字节

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include<stdio.h>
 4 
 5 main()
 6 {
 7     printf("sizeof(char)=%d
", sizeof(char));
 8 
 9     printf("sizeof(short)=%d
", sizeof(short));
10 
11     printf("sizeof(int)=%d
", sizeof(int));
12 
13     printf("sizeof(long)=%d
", sizeof(long));
14 
15     printf("sizeof(long long)=%d
", sizeof(long long));
16 
17     system("pause");
18 }

sizeof(char)=1
sizeof(short)=2
sizeof(int)=4
sizeof(long)=4
sizeof(long long)=8
请按任意键继续. . .

整数的范围

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include<stdio.h>
 4 #include<limits.h>
 5 
 6 main()
 7 {
 8     char c = 255;
 9     int i = 255;
10 
11     printf("c=%d,i=%d
", c, i);//char超出范围,所以显示-1
12 
13     printf("%d,%d
", CHAR_MAX, CHAR_MIN);//127 -128
14 
15     system("pause");
16 }

补码

0000 0001(1)+1111 1111(-1)=(1)0000 0000

1111 1111被当作纯二进制看待时,是255,被当作补码看待时是-1

同理,对于-a,其补码就是0-a,实际是2^n-a,n是这种类型的位数

unsigned

如果一个字面量常数想要表达自己是unsigned,可以在后面加u或U

255U

用l或L表示long(long)

unsigend的初衷并非拓展数能表达的范围,而是为了做纯二进制运算,主要为了移位

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include<stdio.h>
 4 #include<limits.h>
 5 
 6 main()
 7 {
 8     unsigned char c = 255;
 9     int i = 255;
10 
11     printf("c=%d,i=%d
", c, i);
12 
13     printf("%d
", UCHAR_MAX);//255
14 
15     system("pause");
16 }

整数越界

整数是以纯二进制方式进行计算的,所以:

1111 1111+1->1 0000 0000->0

0111 1111+1->1000 0000->-128

1000 0000+1->0111 1111->127

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include<stdio.h>
 4 
 5 main()
 6 {
 7     char c = 127;
 8 
 9     printf("c=%d
", c);//127
10 
11     c = c + 1;
12 
13     printf("c=%d
", c);//-128
14 
15     c = -128;
16 
17     printf("c=%d
", c);//-128
18 
19     c = c - 1;
20 
21     printf("c=%d
", c);//127
22     
23     unsigned char ch = 127;
24 
25     printf("ch=%d
", ch);//127
26 
27     ch = ch + 1;
28 
29     printf("ch=%d
", ch);//128
30 
31     ch = 255;
32 
33     printf("ch=%d
", ch);//255
34 
35     ch = ch + 1;
36 
37     printf("ch=%d
", ch);//0
38 
39     system("pause");
40 }

画图,char,unsigned char的范围

image

整数的输入输出

只有两种类型:int或long long

%d:int

%u:unsigned

%ld:long long

%lu:unsigned long long

如果没有特殊需要,只使用int

1.2浮点类型

如果没有特殊需要,只使用double

1.3逻辑类型

!age<20;

等价于(!age)<20;

永远是1

!done && count > MAX;

等价于(!done) && (count > MAX);

短路

逻辑运算是自左向右进行的,如果左边的结果已经能够决定结果了,就不会做右边的计算

不要把赋值,包括复合赋值组合进表达式!

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include<stdio.h>
 4 
 5 main()
 6 {
 7     int a = -1;
 8 
 9     if (a > 0 && a++ > 1)
10     {
11         printf("ok
");
12     }
13 
14     printf("%d
", a);//仍然是-1,短路
15 
16     system("pause");
17 }

1.4类型转换和条件运算

当运算符的两边出现不一致的类型时,会自动转换成较大的类型

大的意思是能表达的数的范围更大

char->short->int->long->long long

int->float->double

自动类型转换

对曰printf,任何小于int的类型会被转换成int;float会被转换成double

但是scanf不会,要输入short,需要%hd

强制类型转换

要把一个量强制转换成另一个类型(通常是较小的类型),需要

(类型)值

(int)10.2

(short)32

注意这时候的安全性,小的变量不总能表达大的量

(short)32768越界

强制类型转换只是从那个变量计算出了一个新的类型的值,它并不改变那个变量,无论是值还是类型都不改变

强制类型转换的优先级高于四则运算

原文地址:https://www.cnblogs.com/denggelin/p/5575192.html