基本数据类型与表达式
一、数据的储存
1.整型数据——占两个字节,范围[-32768 , 32768]
(1)原码:正数的符号用0,负数的符号用1,其余各位表示数值的绝对值。
(2)反码:正数为本身;负数,数值部分每位求反,符号位不变。
(3)补码:正数为本身,负数为其反码+1(计算机中以补码的表示数值)。
——总结:正数的原码,反码,补码相等
负数的反码为原码取反(符号位不变),补码为反码+1
2.实型数据 的存储方式:符号位+阶码+尾数。例如:- 1.23e +02
3.字符型数据 ——每个字符占用一个字节,存储ASCII码
二、基本数据类型
1.整型与整型常数
(1)整型变量分类 ——无符号(unsign)/有符号、长短
(2)整型常量 表达式
①十进制,②八进制,③十六进制(0x / 0X + 0~9,a~f / A~F)
(3)整数类型
①long型常数:123L/123l ②unsigned型常数:123U /123u ③unsigned long 型常数:123LU / 123lu
Tip:比长整型数还大的数要用实数表示。
2.字符型
(1)字符型常量:'a','0'(注意:单引号)
(2)ASCII字符集(256个)
——整型变量与字符变量的定义和赋值可以互换(在ASCII码的范围内)
(3)转义字符
3.实型
(1)数据长度:
单精度浮点型 —— float ——32位
双精度浮点型 —— double ——64位
(2)数据精度 不等于 取值范围
Tip:①不是所有的实数都能在计算机中精确表示;
②实型常量(浮点数)的类型都是 double
(3)实数的表示——浮点表示法(0.123)/ 科学计数法(1.2e-5)
三、数据的输入与输出
1.整型数据的输入与输出
(1)格式
(2)指定整型数据的输出宽度:例如:%md,%5d(数据宽度为5)// 如果实际输出数小于宽度,用空格补上。
例题:
scanf("%o%d",&a,&b); printf("%d %5d",a,b);
输入:17 17
输出:15 17
2.实型数据
(1)输出:float与double :都以%f(小数形式输出且保留6位小数),%e(指数形式即小数点前有且仅有一位非零数字)
(2)输入:
①float:使用%f,%e
②double:使用%lf,%le(多一个限定词 l(long))
(3)控制输出格式:例如:%5.3f——输出宽度为5,小数部分 3 位,小数点 1 位
3.字符型
(1)使用scanf()和printf():格式控制说明为%c
(2)使用getchar()与putchar():每次仅输入输出一个字符
例题:
代码:
#include <stdio.h> int main () { char ch; ch = getchar(); while(ch!='#'){ if(ch>='A'&&ch<='Z'){ ch=ch-'A'+'a'; }else if(ch>='a'&&ch<='z'){ ch=ch-'a'+'A'; } putchar(ch); ch = getchar(); } return 0; }
解析:'m' - 'a' + 'A'='M' ——ASCII中‘a'与’A‘为任意一个字母小写与大写间的数据差。
4.类型转换:(只是为了本次运算而进行的临时性转换)
(1)自动类型转换:参与运算量的类型不同,则先转换成同一类型,然后进行运算。
(2)强制类型转换:转换的是运算符,不是函数,例如 强制转换应写成(int)x,而不是int(x)
四、表达式
1.算术表达式
(1)优先级
(2)结合方向:单目为从右向左,双目为从左向右。
(3)注意:
① / :整数除整数得整数,且不会四舍五入,直接舍去小数部分。
负整数结果的四舍五入没有规定,所以结果不确定。
如果要精确的结果,可以把一个操作数转换为浮点数 。
②% :针对整型数据
负数%没有规定符号
(4)++,--
①++i,--i :i=i+1;取i值为++n的值
②i++;i-- :取 i 值为表达式i++的值,再来 i=i+1
2.赋值表达式
3.关系表达式
4.逻辑表达式
(1) 优先级与结合方向:!(最高,右结合) && || (左结合)
(2)!a:如果a为真,!a为0()假,!a的值永远为0或1。
5.条件表达式:exp1?exp2:exp3——先判断exp1,真(非0)执行exp2,反之。
6.逗号表达式:从左向右,以最后一个为表达式的值
7.位运算
(1)运算符:
① ~ 按位取反 ②& 按位与(不同为0,同1为1,同0为0) ③^ 按位异或:相同取0,不同取1
④ | 按位或 ⑤移位运算符 << 左移,>>右移 (空出位置用0填补)
(2)操作数只为整型或字符型的数据以及其变体,运算时先将数据转化为二进制。
(3)异或的特殊操作:
①a^a=0 ②a^~a=二进制全是1 ③ ~(a~^a)=0
周结问题
1.以键盘输入^Z或遇到文件结束符时结束数据输入 的题型:
——输入停止以不等于EOF为标志 (不确定循环次数用while)
——用scanf()!=EOF 或者getchar()即可不用再调用输入函数
2.换行问题:
有些题会要求行末不能有多余换行,但是多个样例之间需要,这时候我们一般都是特判:如果不是最后一组样例,就输出换行,是最后一组就不换行。
\\如果无法确认最后一组,则判断第一组前面没有\n,后面每组前面都输出\n。即:除了最后一个样例结尾不换行,其他结尾都换行<=>除了第一个样例开始前不换行,其他都换行。
3.负数的二进制:取反用 ! ,而不用~ ——因为~是按位取反,先转化为二进制取反,再转化为十进制,使得输出不再是二进制。
4.输出二进制:用数组从0->32储存,再从32->0的输出,从而正确输出二进制。
例如:
for(i=0;i<=32;i++)
{ a[i]=1; a[i]=n%2; n=n/2; if(n==0) break; }
for(i=31;i>=0;i--) { printf("%d",a[i]); if(i==8||i==16||i==24||i==32) }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 我与微信审核的“相爱相杀”看个人小程序副业
· DeepSeek “源神”启动!「GitHub 热点速览」
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库