1. 数据类型
按照数据在内存中所占的大小(32位机) 一般有如下划分
int 整型 4个字节
char 字符型 1个字节
float 单精度浮点型 4个字节
double 双精度浮点型 8个字节
long 长整型 4个字节
short 短整型 2个字节
...
按照数据有无符号位的划分 有可以分为 :
signed int : 有符号整型
unsigned int : 无符号的整型
...
进制之间的转换:
十进制数 15 -》 十六进制数 ?
1111 0xf
十六进制的1位 对应二进制的4位
八进制的1位 对应二进制的3位
例:
10进制数 253 --》 16进制 ?
253 = 256 - 1 - 2
256: 1 0000 0000
255: 1111 1111
253: 1111 1101
十六进制:0xfd
//1 2 3 4 5 6 7 8 9 a b c d e f
十进制176换成 八进制 和 十六进制 ?
176 = 128(2^7) + 32(2^5) + 16(2^4)
176 : 10 110 000
十六进制: 0xB0
八进制: 260
整数在计算机中存储形式?
整数在计算机中以补码的形式存放。
正数的补码是其原码本身 原码:二进制
负数的补码是其绝对值的原码 取反 +1
例:
17的补码是多少?
17 = 16(2^4) + 1
00000000 00000000 00000000 00010001
-17的补码是多少?
绝对值17的原码: 00000000 00000000 00000000 00010001
取反 : 11111111 11111111 11111111 11101110
+1 : 11111111 11111111 11111111 11101111 --》 -17的补码
11111111 11111111 11111111 11101111 ?
-1:11111111 11111111 11111111 11101110
取反00000000 00000000 00000000 00010001 -17
2. 运算符与表达式
= : 赋值
== : “等于”
+ - * / % :
5/3 = 1
6.0/3 = 2.0
逻辑运算符:
&& :两者都为真 结果才为真
|| :只要有一个为真 结果就为真
! : 结果取反
在C语言中 什么代表真 什么代表假?
非0代表真 0代表假
printf("%d\n", 5&&-1); //1
printf("%d\n", 5&&0); //0
位运算符: 他的操作的对象是bit位。
& : 按位与
| :按位或
~ :按位取反
^ :异或 “求异” 不同为1 相同为0
<< :按位左移
>> :按位右移
例:
5 & 6 ?
位运算符计算前 先把操作的数都化成二进制
然后对相对应的bit位进行操作
5: 00000101
6: 00000110
————————————————
& 00000100 == 4
练习:
求: 5 | 6 7
~(5 | 17) -22
7 ^ 10 13
3 >> 1 1
1 << 4 16
~(5 | 17) -22
5: 00000000 00000000 00000000 00000101
17: 00000000 00000000 00000000 00010001
___________________________________________
| : 00000000 00000000 00000000 00010101
~ : 11111111 11111111 11111111 11101010
-1: 11111111 11111111 11111111 11101001
取反00000000 00000000 00000000 00010110 16 + 4 + 2 = 22 《==绝对值
自增和自减运算符:
++ :
int a = 1;
a++; 先用 后加
++a; 先加 后用
例:
int a = 1;
printf("%d\n",a++); 1
printf("%d\n",++a); 3
-- :
例:
int a = 1;
printf("%d\n",a--); 1
printf("%d\n",--a); -1
三目运算符:
格式: a ? b : c
如果a表达式为真 那么整个表达式的值就是b的值
如果a表达式为假 那么整个表达式的值就是c的值
printf("%d\n",1>2?3:4);
3. 假设现有有一个整型变量a 请你将a的第8个bit位取反 其他bit位不变 (位操作)
xxxxxxxx xxxxxxxx xxxxxxx0 xxxxxxxx
==>
xxxxxxxx xxxxxxxx xxxxxxx1 xxxxxxxx
任何数&上1 结果都是其本身
x = 1 x&1 = 1
x = 0 x&1 = 0
任何数|上0 结果都是其本身
x = 1 x|0 = 1
x = 0 x|0 = 0
任何数^上1 结果都是其本身取反
x = 1 x^1 = 0
x = 0 x^1 = 1
任何数^上0 结果都是其本身
x = 1 x^0 = 1
x = 0 x^0 = 0
xxxxxxxxxxxxxyxxxxxxxx a
^ 0000000000000100000000 2 ^ 8 (1<<8)
————————————————————————————————————
xxxxxxxxxxxxxkxxxxxxxx
3.三大结构
1. 顺序结构
在代码块中的代码都是按照从上到下的顺序执行。
{
xxx;
yyy;
zzz;
}
2. 选择/分支结构
if
else if
else
switch - case
3. 循环结构
while
for
0. 求所有的水仙花数
水仙花数: 他是一个三位数 满足个位的立方+十位的立方 +百位的立方 的和等于他本身的值的数
int i = 0;
for(i=100;i<1000;i++)
{
//个位
int gewei = i%10; // 123 123%10 = 3
//十位
int shiwei = i/10%10; // 123 123/10%10 = 2
//百位
int baiwei = i/100 ;
if( gewei * gewei *gewei + shiwei *shiwei*shiwei +baiwei*baiwei*baiwei == i)
{
printf("%d\n",i);
}
}
2.求100-1000之间满足各位数字之和是5的所有数。
int i=0;
for(i=100;i<1000;i++)
{
//个位
int gewei = i%10; // 123 123%10 = 3
//十位
int shiwei = i/10%10; // 123 123/10%10 = 2
//百位
int baiwei = i/100 ;
if(gewei + shiwei + baiwei == 5)
{
printf("%d\n",i);
}
}
《算经》中提出一个著名的“百钱买百鸡问题”,鸡翁一,值钱5,鸡母一,值钱三,鸡雏三,值钱一,
百元买百鸡,问翁,母,雏各几何?
// 5x + 3y + z/3 = 100;
// x + y + z = 100;
int x ; //鸡翁
int y ; //鸡母
int z ; //鸡雏
for(x=0; x<21 ;x++)
{
for(y=0;y<34;y++)
{
for(z=0;z<100;z+=3)
{
if(x+z+y == 100 && (5*x + 3*y + z/3 == 100 ) )
{
printf("x=%d , y=%d , z=%d\n",x,y,z);
}
}
}
}