(关键字)sizeof:求数据类型字节数
sizeof.c
#include<stdio.h>
int mian()
{
printf("int %d\n",sizeof(int));
printf("short %d\n",sizeof(short));
printf("long %d\n",sizeof(long));
printf("double %d\n",sizeof(double));
printf("float %d\n",sizeof(float));
printf("char %d\n",sizeof(char));
printf("int * %d\n",sizeof(int *));
printf("char *",sizeof(char *));
return 0;
}
运行结果:
(关键字)volatile:防止编译时被优化
(关键字)const:修饰只读变量
const.c
#include<stido.h>
int main()
{
const int cc = 3; //cc只读变量,只能说明,不能通过cc这个变量修改对应的内存空间的值
int *p = (int *)&cc; //但是可以通过指针修改
*p = 1;
printf("%d\n",cc);
return 0;
}
运行结果:
const就近原则
const int *p; 所指内容不能改变
int * const p; 地址不能改变
const int * const p; 都不能改变
(库函数)strlen:求字符串长度,遇到\0结束
strlen.c
#include<stdio.h>
#include<string.h>
int main()
{
char a[1000];
int i;
for(i=0;i<1000;i++)
{
a[i]=-1-i;
printf("%4d",a[i]);
}
printf("\nstrlen:%d\n",strlen(a));
return 0;
}
运行结果:
分析:char占一个字节,8位,strlen遇到\0结束
符号位为1表示负数,其余全1表示-1,其余全0表示负数最大值
个人理解:-7-1=-8
-7的补码: 1001
-1的补码: 1111
相加结果:11000,前面越界舍去即1000是-8的补码
负数补码的算法:从左往右第一个1保持不变,其余依次取反
题目一:
int i = -20;
unsigned int j = 10;
i+j=?
int i = -20;
unsigned int j = 10;
if (i + j > 0)
printf("big zero\n");
else
printf("small zero\n");
printf("i+j=%d\n",i+j); \\以带符号的十进制形式输出整数
printf("i+j=%u\n",i+j): \\以无符号的十进制形式输出整数
运行结果:
分析:往表示大的转换,这里有符号转换为无符号
-20的补码: 1111 1111 1111 1111 1111 1111 1110 1100
10的源反补一致: 0000 0000 0000 0000 0000 0000 0000 1010
两数相加: 1111 1111 1111 1111 1111 1111 1111 0110
该数无符号的十进制为:4294967286
题目二:
unsigned int a = 3;
unsigned int j;
j = a *(-1);
j?
unsigned int a = 3;
unsigned int j;
j = a *(-1);
if(j>0)
printf("big zero\n");
else
ptintf("small zero\n");
printf("j=%d\n",j);
printf("j=%d\n",j);
运行结果:
分析:
-1的补码: 1111 1111 1111 1111 1111 1111 1111 1111
3的源反补一致:0000 0000 0000 0000 0000 0000 0000 0011
两数相乘:1111 1111 1111 1111 1111 1111 1111 1101
该数的无符号十进制表示:4294967293