c语言基本知识(数据类型-有符号和无符号和宏定义))

数据类型

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;

}

  • 35
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值