1.Release程序运行时会对Debug程序进行优化
例如将变量创建在数组之后,避免了数组越界引用时导致死循环的可能。
2.整形变量所占空间的大小
3.构造类型
数组的类型为去掉数组名之后的剩余部分
4.指针类型
5.空类型
6.数值的不同表现形式
7.数据在内存中的两种存储方式
计算机的选择哪种存储方式,取决于硬件设施 ,一般都采用小端存储
#include<stdio.h> //判读大小端存储
int main()
{
int a = 1;
//注:内存在存储时以二进制存储,一个字节占一个内存单元
//00000000 00000000 00000000 00000001——(int)a 二进制
//00 00 00 01——(int)a 十六进制
//00000001——(char)a 二进制
//01——(char)a 十六进制
if (*(char*)&a == 1)
{
printf("小端存储");
}
else
{
printf("大端存储");
}
return 0;
}
8.有符号变量与无符号变量取值范围的计算方法
9.习题
(1)第一题
题目:计算输出结果
解析:
答案:-1 ,-1,255
#include<stdio.h>
int main()
{
char a = -1;
//10000000 00000000 00000000 00000001——int(-1) 原码
//11111111 11111111 11111111 11111110——int(-1) 反码
//11111111 11111111 11111111 11111111——int(-1) 补码
//11111101——char(-1)
signed char b = -1;
//10000000 00000000 00000000 00000001——int(-1) 原码
//11111111 11111111 11111111 11111110——int(-1) 反码
//11111111 11111111 11111111 11111111——int(-1) 补码
//11111111——signed char(-1)
unsigned char c = -1;
//10000000 00000000 00000000 00000001——int(-1) 原码
//11111111 11111111 11111111 11111110——int(-1) 反码
//11111111 11111111 11111111 11111111——int(-1) 补码
//11111111——unsigned char(-1)
printf("a=%d,b=%d,c=%d",a,b,c);
//整形输出需要整形提升
//char (-1)提升后:
//11111111 11111111 11111111 11111111——int补码
//11111111 11111111 11111111 11111110——int 反码
//10000000 00000000 00000000 00000001——int 原码 =(-1)//signed char (-1)提升后:
//11111111 11111111 11111111 11111111——int 补码
//11111111 11111111 11111111 11111110——int 反码
//10000000 00000000 00000000 00000001——int 原码 =(-1)//unsigned char (-1)提升后
//00000000 00000000 00000000 11111111——int 补码=原码=255
return 0;
}
(2)第二题
题目: 计算输出结果
解析:
答案: 4,294,967,168
#include<stdio.h>
int main()
{
char a = -128;
//10000000 00000000 00000000 10000000——int (-128) 原码
//11111111 11111111 11111111 01111111——int (-128) 反码
//11111111 11111111 11111111 10000000——int (-128) 补码
//10000000——char (-128)
printf("%u\n",a);
//整形提升后:
//11111111 11111111 11111111 10000000——unsigned int 补码=4,294,967,168
return 0;
}
(3) 第三题
题目: 计算输出结果
解析:
答案:-10
#include<stdio.h>
int main()
{
int i = -20;
//10000000 00000000 00000000 00010100——int(-20) 原码
//11111111 11111111 11111111 11101011——int(-20) 反码
//11111111 11111111 11111111 11101100——int(-20) 补码
unsigned int j = 10;
//00000000 00000000 00000000 00001010——unsigned int (10) 原码=补码
printf("%d\n",i+j);
//有符号变量与无符号变量进行算数运算时,需要进行类型转换
//10000000 00000000 00000000 00010100——unsigned int (-20) 提升后
//00000000 00000000 00000000 00001010——unsigned int (10) 原码=补码
//10000000 00000000 00000000 00001010——unsigned int (-20)-(10)//以整形输出时,无符号整形需类型转换
//10000000 00000000 00000000 00001010——int (-20)-(10)=(-10)
return 0;
}
(4)第四题
题目:计算输出结果
解析:
答案:当i=0时,执行i--后变为一个极大值,死循环
#include<stdio.h>
int main()
{
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n",i);
}
//当i=0时,执行i--
//00000000 00000000 00000000 00000000——int (0)
//00000000 00000000 00000000 00000000——unsigned int (0) 类型转换后//10000000 00000000 00000000 00000001——int (-1) 原码
//11111111 11111111 11111111 11111110——int (-1) 反码
//11111111 11111111 11111111 11111111——int (-1) 补码
//11111111 11111111 11111111 11111111——unsigned int (-1) 类型转换后 =4,294,967,295
return 0;
}
(5)第五题
题目:计算输出结果
解析:
答案:255
#include<stdio.h>
#include<string.h>
int main()
{
char a[1000];
//char的取值范围-128~127
int i = 0;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
//故无论怎么循环,a[i]的取值范围都为a[-128]~a[127]
printf("%d",strlen(a));
//128+127=255
//strlen()函数的返回值为unsigned int类型
return 0;
}
(6)第六题
题目: 计算循环次数
解析:
答案:死循环
#include<stdio.h>
unsigned char i = 0;
int main()
{
for (i = 0; i <=255; i++)
{
printf("Hello world\n");
}
//当i=255时,i++后
//11111111——unsigned char (255)
//00000000——unsigned char (255)+(1)=0
//........
return 0;
}
(7)第七题
题目:
解析:
答案:>
#include<stdio.h>
#include<string.h>
int main()
{
//strlen()函数返回值类型为unsigned int
//00000000 00000000 00000000 00000011——unsigned int (3)
//00000000 00000000 00000000 00000110——unsigned int (6)
//00000000 00000000 00000000 00000011——unsigned int (6)-(3)=3
if (strlen("abc") - strlen("abcdef") >= 0)
{
printf(">\n");
}
else
{
printf("<\n");
}
return 0;
}