数据类型
1.无符号的数,所有位都是数据位
以
char
类型为例
占的字节数:
char
占一个字节,八位。
范围:
[0, 255]
类型定义:
unsigned char
无符号数的原码、反码、补码规则
原码
,
反码,补码是它本身
. [
正数和
0]
例:150
原码:占在人的角度化成二进制
1001 0110
反码:无符号的数反码和源码一样。
1001 0110
补码:无符号的数补码和源码一样。
1001 0110
2. 有符号,最高位是符号位,其他位是数据位
以
char
类型为例 占得字节数:一个字节,八位。
范围:[-128, 127]
,
特殊的有-128补码为 1000 0000
signed char
,定义变量的时候默认类型的前 面是有符号的signed
最高位是1,代表负数。
最高位是0,表示正数。
有符号数的原码、反码、补码规则:
a.正数的原码、反码、补码 ——正数的原码、反码、补码都和原码一样
b.负数的原码、反码、补码:
原码
负数的原码 最高位为1,代表负数
反码
负数的反码 = 原码符号位不变,其他位按位取反
补码
负数的补码 = 反码 + 1
有符号的数 例
20 0001 0100
最高位是
0
,表示正数,他的源码、反码、补码 都一样的。
-110 1110 1110 最高位是1
,表示负数
原码:人的角度化成的二进制
1110 1110
反码:原码按位取反,符号位不变。
1001 0001
补码:反码加一。
1001 0010
示例:
#include<stdio.h>
int main()
{
unsigned int a = -1;
printf("%d\n", a);
unsigned char ch = -1;
printf("%d\n", ch);
return 0;
}
3.类型转换
隐式转换(自动转换)
a. 在赋值运算中,赋值号两边的数据类型不同时,需要
把右边表达式的类型转换为左边变量的类型,这可能
会导致数据失真,或者精度降低
b. 不同类型的混合运算中,小类型(范围)会自动转
化为大类型(范围),类似于把小杯子的水倒到大
杯子中不会产生溢出。
显式转换(强制转换)
大杯的水倒到小杯子中有可能产生溢出,例如
int
转
char
例
flaot d=9.9;
int a=(int)d;
printf("%d\n",5+(int)5.5);
注意 :计算机不能四舍五入
#include<stdio.h>
int main()
{
float d = 9.9;
int a = (int)d;
printf("%d\n", 5 + (int)5.5);
return 0;
}
宏定义
在
C
语言中以
“ # ”
号开头的行,都称为
“
编译预处理
”
命令行,不得以
“
;
”
形式
#define 标识符号(宏名) 替换文本(宏值)
#define M 5
ANSI C 规定了以下几个预定义宏,它们在各个 编译器下都可以使用:
__LINE__:表示当前源代码的行号;
__FILE__:表示当前源文件的名称;
__DATE__:表示当前的编译日期;
__TIME__:表示当前的编译时间;
带参数的宏定义
形式
#define
宏名(形参表) 替换文本
#define M( X , Y ) ( X * Y )
宏函数
#define M {int a = 0;printf("%d",a);}
终止宏定义
#undef 宏名
注意:
完全原样替换
替换文本中可以包含前面已经定义过的宏名
宏定义一行写不下需要换行时,在当行最后一个字符后加一个反斜杠“\”
同一个宏名不能重复定义,除非两个宏定义完全一致
不会替换双引号中与宏名相同的字符串
不会替换用户标识符中的成分
宏定义可以写在代码中任何位置,只对定义后的 代码中宏名出现的地方做替换
练习
练习
1
:
#define M 10
#define N 20
#define CALC(T1,T2) (T1 + T2 * T1 - T2)
1.
要求输出表达式
(M + N) * M
的值
2.
把
T1
设置为
M + N
把
T2
设置为
M - N
然后计算输出
CALC
的值。
练习
2:
一个水分子的质量约为
3.0*10-23g
,
1
夸脱水大约有
950g
,编写一 个程序,要求计算4
夸脱水,一共包含多少水分子数
.
#define WEIGHT 3.0e-23
#define QUART 950
#define WATER_NUM ...... //
自己写表达式
然后最后以
%f %le
输出
WATER_NUM
的值。
练习
3:
#define M 10 + 2
#define N 8 + 3
#define T 3 - 1
#define DO_CALC(x,y,z) (x * y + z)
要求写代码实现调用
DO_CALC
这个宏
,
给
x
参数传 递宏M
,给
y
参数传递宏
N
,给
z
参数传递宏
T
。然
后输出最终计算的结果
练习一:
#include <stdio.h>
#define M 10
#define N 20
#define CALC(T1,T2) (T1 + T2 * T1 - T2)
int main() {
int T1 = M + N;
int T2 = M - N;
int calcResult = CALC(T1, T2);
int h = (M + N)*M ;
printf("%d\n", calcResult);
printf("%d\n", h );
return 0;
}
练习二
#include <stdio.h>
#define WEIGHT 3.0e-23
#define QUART 950
int main() {
// 计算4夸脱水的水分子数
double waterNum = (4 * QUART) / WEIGHT;
// 输出结果
printf("4夸脱水包含的水分子数为: %f\n", waterNum);
// 使用科学计数法输出,以匹配%le的格式
printf("4夸脱水包含的水分子数为: %le\n", waterNum);
return 0;
}
练习三
#include <stdio.h>
#define M 10 + 2
#define N 8 + 3
#define T 3 - 1
#define DO_CALC(x,y,z) (x * y + z)
int main() {
// 直接调用DO_CALC宏,并将M、N、T作为参数传递
int result = DO_CALC(M, N, T);
// 输出最终计算的结果
printf("The result of DO_CALC(M, N, T) is: %d\n", result);
return 0;
}
文件包含
1.所谓文件包含,是指在一个文件中,去包含另一个文件的全部内容
2.形式
#include "
文件名
"
在当前目录下寻找该文件,如果找不到就去系统指定目录下寻找
#include <文件名
>
直接去系统指定下目录寻找该文件
4.头文件中的内容一般是宏定义和函数声明
c语言中常见的条件编译
#if 宏名
c语言1;#else
c语言2;#endif
功能:判断宏名是否为真,为真编译c语言代码1,否则编译C语言代码2
#include<stdio.h>
#define T 1
int main()
{
#if T
printf("hello!\n");
#else
printf("world!\n");
#endif
return 0;
}
判断宏是否定义
#ifndef 宏名 判断宏名是否没有定义
C语言语句
#endif
功能:如果宏名没有定义系统会执行C语言语句,若是宏名定义了,系统不会执行C语言语句。
示例:
#include<stdio.h>
#define BUG
int main()
{
#ifndef BUG
printf("Good Good studey!\n");
#endif
printf("GAME OVER!\n");
return 0;
}