3.4-day04-C语言基础
printf函数使用时的四个特殊字符:\",\\,%%,\r
scanf函数可以从键盘上读取数据并记录到变量中,需要包含stdio.h文件。
使用scanf函数的时候一定要使用变量的地址表示变量而不能使用变量名称。
字符类型由256个不同的字符构成,在C语言中使用char表示。ASCII码表规定了字符到数字之间的对应关系。
'd' - 'a'等于'D' - 'A'等于'3' - '0'
unsigned char叫做无符号字符类型。
计算机内存以字节为单位进行管理,每个变量都由一个或多个相邻的字节组成。
sizeof关键字可以计算出某个变量或某种数据类型占据多少个字节的空间。
sizeof关键字可以对表达式的结果求大小,但是表达式中的所有修改都不会保留。
short叫做短整数类型,unsigned short叫做无符号短整数类型。这两种数据类型都在内存中占2个相邻的字节。
long叫做长整数类型,unsigned long叫做无符号长整数类型。这两种数据类型都在内存中占4个相邻的字节。
int叫做整数类型,unsigned int叫做无符号整数类型。在我们的计算机上这两种类型都在内存中占4个相邻的字节。
float叫做单精度浮点数类型,这种类型在内存中占4个连续的字节。
double叫做双精度浮点数类型,这种类型在内存中占8个字节。
使用一组0或者1表示数字的方法叫做二进制,计算机内部所有数字都是使用二进制表示的。
一个字节由8个二进制位构成
十进制到二进制转换例子:
123 = 64 + 32 + 16 + 8 + 2 + 1 = 2^6 + 2^5 + 2^4 + 2^3 + 2^1 + 2^0 = 01111011
二进制到十进制转换的例子:
00110110 = 2^5 + 2^4 + 2^2 + 2^1 = 32 + 16 + 4 + 2 = 54
负数到二进制的转换方法是正数二进制按位求反再加一,例如
51 = 00110011
-51 = 11001100 + 1 = 11001101
73 = 01001001
-73 = 10110110 + 1 = 10110111
负数的二进制表示方法叫做补码,正数的二进制表示方式既叫原码也叫补码
负数的二进制也可以通过按位求反加一的办法计算出相反的正数的二进制。
根据负数补码计算负数的过程如下
10101001的相反数 = 01010110 + 1 = 01010111 = 87
10101001对应的十进制负数是-87
二进制数字最左一位叫做符号位,整数的符号位是0负数的符号位是1。
把一个二进制数字从右向左每三个数为分成一组,把每一组用一个0到7之间的数字替换就得到八进制数字。
如果每四个数为分成一组就得到十六进制数字。十六进制数字中用a,b,c,d,e,f分别代表每个数位上的10到15。
C语言支持+,-,*,/和%(取余操作)
符合赋值操作符的优先级和赋值操作符的优先级一样低
r 转义序列。表示carriage return(回车键)
\n是另起一行,\r的话回车回到本行的开头,如果继续输入的话会把先前的覆盖掉
Turbo C2.0中有些常用的字符用以下特殊规定来表示:
规定符 等价于 含义
'\f' '\X0C' 换页
'\r' '\X0D' 回车
'\t' '\X09' 制表键
'\n' '\X0A' 换行
'\\' '\X5C' \符
'\'' '\X27' '符
'\"' '\X22' "符
printf("\n");
正常理解,就是输出两个字符,‘\’和‘n’,但这里的\表示转义,就是把\n当做一个字符输出,而默认规定\n代表换行,所以这里就输出一个换行符;%也是转义符;
正常理解,就是输出两个字符,‘\’和‘n’,但这里的\表示转义,就是把\n当做一个字符输出,而默认规定\n代表换行,所以这里就输出一个换行符;%也是转义符;
%p用来输出指针
%x用来输入int 类型。
二者都是16进制值输出
如果是32位系统 那么没区别
如果是64位系统 那么 %p会输出8字节数据。 而%x只能输出4字节数据。
也就是说
32位系统 %p等效于%x
64位系统 %p等效于%lx
%p打印地址的啊! %x十六进制形式打印 完成不同
首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255;
如果是char,那么系统认为最高位是符号位,而int可能是16或者32位,那么会对最高位进行扩展(注意,赋给unsigned int也会扩展)
而如果是unsigned char,那么不会扩展。
01printf.c
/* printf练习 */ #include <stdio.h> int main() { printf("\"\n"); printf("\\\n"); printf("%%\n"); printf("abc\rxy\n"); return 0; }

02scanf.c
/* scanf练习 */ #include <stdio.h> int main() { int shu_zi = 0, shu_zi1 = 0; printf("请输入两个整数:"); scanf("abc%d def%d", &shu_zi, &shu_zi1); //scanf("%d", shu_zi); 段错误 printf("%d %d\n", shu_zi, shu_zi1); return 0; }

03scanf.c
/* scanf练习 */ #include <stdio.h> int main() { int shu_zi = 0, shu_zi1 = 0; printf("请输入一个加法公式:"); scanf("%d + %d", &shu_zi, &shu_zi1); printf("计算结果是%d\n", shu_zi + shu_zi1); return 0; }

04sizeof.c
/* sizeof练习 */ #include <stdio.h> int main() { char zi_fu = 0; unsigned char u_zi_fu = 0; printf("变量zi_fu占%d个字节\n", sizeof(zi_fu)); printf("char类型变量占%d个字节\n", sizeof(char)); printf("变量u_zi_fu占%d个字节\n", sizeof(u_zi_fu)); printf("unsigned char类型变量占%d个字节\n", sizeof(unsigned char)); zi_fu = 'a'; sizeof(zi_fu = 'b'); printf("%c\n", zi_fu); return 0; }

05bit.c
/* 进制练习 */ #include <stdio.h> int main() { printf("%d %d %d\n", 12, 012, 0x12); printf("%d 0%o 0x%x\n", 18, 18, 18); printf("%p\n", 14); return 0; }

06bit.c
/* 二进制练习 */ #include <stdio.h> int main() { int shu_zi = 300; unsigned char u_zi_fu = 200; char zi_fu = shu_zi; printf("%d\n", zi_fu); 44 zi_fu = u_zi_fu; printf("%d\n", zi_fu); -56 return 0; }


分析如下:
char 类型: -128 ~ 127
unsigned char: 0 ~ 255
int main () { unsigned char a=200; unsigned char b=100; unsigned char c=a+b; printf("%d,%d",a+b,c); return 0; }
这里,c为300,存在内存的溢出;0-256,44-300;这里c输出的是300;
本题中:
int(300)整型转换为char字符型;
int为4个字节;char为一个字节;
300(1001 01100)截取后面8位,为0010 1100,结果为44;
unsigned(200)无符号字符串转换为有符号字符串,并且以%d十进制形式输出:
和下面代码意思一样:

转换为char(200)要以%d形式输出:
(1)内存中以二进制补码形式存在:200的二进制:11001000
(2)因为要求以%d(十进制有符号整数类型)输出,因此我们将他的补码补到32位。
有符号数200 最高位 为 0 后八位为11001000存储在signed char变量中,
因为此变量只有八个比特位空间, 所以存储时被截断为 11001000;
因为为signed char类型,最高位1被解释为符号位。
(3) 以%d形式输出,先补全补码,补符号位1; 11111111 11111111 11111111 11001000
(4)此补码被理解为负数的补码,还原这个负数: -(相反数+1)
00000000 00000000 00000000 00110111 + 1 = 00000000 00000000 00000000 00111000 = 56
(5)加负号,-56; .
07opr.c
/* 操作符练习 */ #include <stdio.h> int main() { int shu_zi = 0, shu_zi1 = 0; printf("15 / 7 = %d\n", 15 / 7); printf("15 %% 7 = %d\n", 15 % 7); shu_zi = shu_zi1 = 7; printf("shu_zi是%d,shu_zi1是%d\n", shu_zi, shu_zi1); shu_zi += 2; //相当于shu_zi = shu_zi + 2 printf("shu_zi是%d\n", shu_zi); shu_zi *= 2 + 3; printf("shu_zi是%d\n", shu_zi); return 0; }

浙公网安备 33010602011771号