C语言复习,内核 Hello word 开发,编译,测试,调试
窗体顶端
ppt
sizeof(char)=
sizeof(short)=
sizeof(int)=
sizeof(long)=
sizeof(float)=
sizeof(double)=
sizeof(double *)=
sizeof(bool)=
sizeof("123456")=
sizeof(100i64)=
typedef struct _a
{
char c1;
long i;
char c2;
double f;
}a;
typedef struct _b
{
char c1;
char c2;
long i;
double f;
}b;
sizeof(a)=
sizeof(b)=
-->ppt
int a = 1;
char *p1;
static int x = 10;
int main(void)
{
int b = 0;
char s1[] = "123";
char *p2;
char *s2 = "123";
static int c =10;
p1 = (char *)malloc(128);
p2 = (char *)malloc(256);
free(p1);
free(p2);
return 0;
}
&,|,~,^,<<,>>
表格法
补码,原码,反码
原码:在数值前面增加了一位符号位(即最高位为符号位),该位为0表示正数,该位为1表示负数,其余位表示数值的大小。
1 - 1 = 1 + ( -1 ) =(00000001) + (10000001) = (10000010) = -2
反码:正整数的反码就是其自身,而负整数的反码可以通过对其绝对值逐位求反来求得。
1 - 1 = 1 + ( -1 )= (00000001) + (11111110) = (11111111) = -0
补码:正数的补码与原码相同,负数的补码就是对该负数的绝对值求反加1,0的补码是0。
1 - 1 = 1 + (-1) = (00000001) + (11111111) = (00000000) =0
补码(正数自身,0是0,负数绝对值取反+1,47,100,240,-1,-128,127)一个字节扩展为2个字节。
原码,反码和补码(符号位可以参与运算,0是唯一的,简化算术运算统一为加法运算(减,乘,除如何统一的?))
①(char)(127<<1)+1= (思考加和不加(char))
(0…01111111)<<1 + 1=0…11111111=255
(char)(0…01111111<<1) + 1= …
②(char)(-1>>1)+1=
③1<<2+3=
记忆口诀:https://www.mallocfree.com/interview/c-3-oper.htm
④(15&240)+((2^100)%7)=(此处2^100表示2的100次方)
2^100=2*2^99=2*(2^3)^33=2*(8)^33=2*(1+7)^33=2(1+33*1^32*7+…7^33)
⑤(char)(-128*-1)=
数的溢出
⑥(2018^2018)+(20180818^0)=
⑦1^2^4^5^6...^1024=(即整数从1到1024,除了3之外所有数的异或)
1^2^3^4…^1024=1024;(考查1^2^3..^8)
1^2^4^…^1024=(1^2^3^3^4…^1024)=(1^2^3^4…^1024)^3=1024^3=1027
异或的性质
⑧(0x12345678>>24)&0xFF=
与运算性质
x&1, x&3, x&7, x&f, x&ff, x&ffff
x&(x-1)
x = 1001 0110
x-1 = 1001 0101
x&(x-1) = 1001 0100
while(x!=0) {
x &= (x-1);
}
⑨ 0x12345678 | ~0xFFFEFFFF =
进制转换:十进制到二进制转换,二进制到十六进制,十进制到十六进制。任意进制转化
C语言:0x/0/0b(C++14) u/l/ul/i64/ll/LL 汇编:1aH/17O/12D/110B
⑩假如36进制的规则为“0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”。 比如常见10进制与36进制对应关系: 1=“1”,10=“A”,20=“K”,35=“Z”,36=“10” 。 那么10进制128对应的36进制为:
整数存储:低位优先和高位优先 -->ppt
void fun(char c[])
{
printf("%d\n" , sizeof(c));
}
void fun2(char &c)
{
printf("%d\n" , sizeof(c));
}
void fun3(char(&c)[9])
{
printf("%d\n" , sizeof(c));
}
int main()
{
char c[] = "12345678";
printf("%d\n" , sizeof(c));//①
fun(c);//②
fun2(*c);//③
fun3(c);// ④
return 0;
}
按照程序执行顺序输出结果为:
①:
②:
③:
④:
-->ppt
ppt
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(char *s)
{
char *str = NULL;
GetMemory(str);
strcpy(str, s);
printf(str);
}
程序存在的问题:
改正后的代码:
-->ppt
Uaf
程序1:
1 #include <stdio.h>
2 int main(int argc,char *argv[])
3 {
4 char x,y,z;
5 int i;
6 int a[16];
7 for(i=0;i<=16;i++)
8 {
9 a[i]=0;
10 printf("\n");
11 }
12 return 0;
13 }
程序1的问题及导致的现象:
对程序1的修改:
程序2:
1 #include <stdio.h>
2 void print_array(int a[])
3 {
4 for(int i = 0;i<10;i++)
5 {
6 printf(“%d\n”, a[i]);//a[9]
7 }
8 }
9 int main(void)
10 {
11 int a[9] ={0};//a[0]…a[8]
12 print_array(a);
13 return 0;
14 }
程序2的问题及导致的现象:
对程序2的修改以达到尽早发现问题:
(全卷完,请仔细检查后,在下面获取并填写验证码,然后点击“交卷”按钮提交试卷)