C语言
C是有类型的语言,C语言的变量必须在使用前定义,并且需要确定类型。
对于我们之前所有写过的程序来讲,都是先定义一个什么类型变量,然后再使用他
- c语言以后的语言向两个方向发展:
- C++/Java更强调类型,对类型的检查更加严格
- JavaScript,Python,PHP不看重类型,甚至不需要在使用前事先进行定义
类型安全(两种观点)
- 支持强类型的观点认为明确的类型有助于尽早的发现程序中的简单错误
- 反对强类型的观点认为过于强调类型迫使程序员面对底层,实现而非失误逻辑
- 总的来说,早期语言强调类型,面向底层的语言强调类型
- C语言需要类型,但是对类型的安全检查并不足够,C语言并不是一个非常强的强类型语言,但是它又是一个类型语言
C语言的类型
- 整数
- char, short, int, long, long long(C99类型)
- 浮点数
- float, double, long double(C99类型)
- 逻辑
- bool(C99类型)
- 指针
- 自定义类型
类型的不同
- 类型名称:int, long, double
- 输入输出时候的格式化:%d, %ld, %lf
- 所表达的数的范围:shar < short < int < float < double
- 内存中所占据的大小:1个字节到16个字节
- 内存中的表达形式: 二进制数(补码), 编码
sizeof
sizeof:
- sizeof 是一个运算符,给出某个类型或者变量在内存中所占据的字节数。
- siezof 是静态运算符,它的结果在编译时刻就决定了。
- 不要在 siezof 的括号里做运算,这些运算都是不会被进行的。
举例运用:
sizeof(int)
sizeof(x)
sizeof(short)
sizeof(long)
等等
整数类型
让我们来通过siezof来试试整数类型在内存中所占据的字节数。
实际运用代码如下:
#include <stdio.h>
int main()
{
printf("sizeof(char)=%d\n", sizeof(char));//占计算机1字节,8bit(位)
printf("sizeof(short)=%d\n", sizeof(short));//2
printf("sizeof(int)=%d\n", sizeof(int));//4
printf("sizeof(long)=%d\n", sizeof(long));//4
printf("sizeof(long long)=%d\n", sizeof(long long));//8
char c = 255;
int i = 255;
printf("c=%d,i=%d", c , i);
//char c : 11111111 实际表-1,此时被当作补码表示了
//int i :00000000 00000000 00000000 11111111 实际表255
unsigned char b =255;//无符号整型,表示范围从-128~127变成0~255
printf("unsigned char b=%d",b);
return 0;
}
- 这个代码的运行结果如下:
sizeof(char)=1
sizeof(short)=2
sizeof(int)=4
sizeof(long)=4
sizeof(long long)=8
c=-1,i=255unsigned char b=255
整数
- char :1个字节(8比特)
- short : 2个字节
- int : 取决于编译器(CPU), 通常的意义是“ 1个字节 ”
- long : 取决于编译器(CPU), 通常的意义是“ 1个字节 ”
- long long : 8个字节
整数的内存表达
- 计算机内部一切都是二进制
- 18 ——> 00010010
- 0 ——> 00000000
- -18——> ?
如何表示负数
- 十进制用“ - ”来表示负数, 在做计算的时候
二进制负数 - 1个字节可以表达的数:
- 00000000——11111111(0~255)
- 三种方案:
- 仿照十进制, 有一个特殊的标志表示负数
- 取中间的数为0 , 如10000000表示0 , 比它小的数是负数,比它大的数是正数
- 补码:
对补码的解释,如何补码?
- 考虑 -1 , 我们希望-1+1 ——> 0。如何做到呢?
- 0 ——> 00000000
- 1 ——> 00000001
- 11111111 + 00000001 ——> 10000000
- 因为0-1——> -1,所有, -1=:
- (1)00000000 - 00000001 ——> 11111111
- 11111111被当作纯二进制看待时, 时=是255, 被当作补码看待时是-1
- 同理, 对于-a, 其实补码就是0-a, 实际是2^n -a , n是这种类型的位数
补码的意义就是拿补码和原码可以加出一个溢出的“ 零 ”