游戏即时获得用户输入
_kbhit()
_getch()
- kbhit有键盘按下时候 返回非零值 ,当没有键盘按下时候,返回零值 判断键盘是否有按下
- getch kbhit知道有按下但是不知道按下的是哪个键盘,所以用getch来获取
int _tmain(int argc, char*argv[])
{
char cInput = 0;
if ( _kbhit() != 0)
{
cInput = _getch();
}
}
内存结构开端
scanf("%d"),&nValue;
scanf("%d",&nValue);
第一个会造成中断 ,一般有中断现象就点击中断 会出现绿色小箭头那么bug就在附近
基本的数据类型在内存中表现的形式
sizeof
sizeof是C语言的一种运算符 (地位相当于+ -),
作用计算一个表达式的长度 在编译的时候替换成数值
int main()
{
printf("%d\r\n", sizeof(char));
printf("%d\r\n", sizeof(short int));
printf("%d\r\n", sizeof(int));
printf("%d\r\n", sizeof(double));
printf("%d\r\n", sizeof(float));
printf("%d\r\n", sizeof(long));
return 0;
}
答案是 1 2 4 8 4 4
再看另外的例子
int main()
{
char chValue = 5;
short int sValue = 5;
int nValue = 5;
printf("%d %d %d", chValue, sValue, nValue);
return 0;
}
输出都是5,看起来char short int int 类型的变量,是没有区别的
但是通过内存窗口就可发现
char:
short int:
int:
但是 char 05 short int 是05 00 int 是 05 00 00 00
数据的大小尾形式
- 小尾方式: 数据的较低位,存放在内存的较低的地址处
- 大尾方式: 数据的较低位,存放在内存中较高的地址处
采用哪种方式取决于 使用CPU,比如x86采用的小尾方式
power pc是大尾方式;比如高版本arm芯片,其大尾方式还是小尾方式,自行设置
PC从上向下 上面地址越低。
面试题 怎么判断大小尾
printf到底在干什么
- 读取数据类型
- 根据格式化输出的标志, 将读取的数据按要求的格式化输出
int _tmain(int argc, _TCHAR* argv[])
{
int nValue = 0x88;
char chValue2 = 0x88;
printf("%p\r\n", nValue);
printf("%p\r\n", chValue2);
nValue = 0x55;
chValue2 = 0x55;
printf("%p\r\n", nValue);
printf("%p\r\n", chValue2);
return 0;
}
前后不一致,这主要取决于补码
补码(计算机如何存放负数)
所谓计算机中如何存放负数,它最终其实只是一种的”编码方式“而已,而编码方式只是一种“约定”而已。
取反加一
int main(void)
{
int nValue1 = 0x55;
short int sValue3 = 0x55;
char chValue2 = 0x55;
printf("%d, %d, %d\n", nValue1, chValue2, sValue3);
nValue1 = -2; // 0xFFFFFFFE 取反加一
chValue2 = -2; // 0xFE 取反加一
sValue3 = -2; // 0xFFFE 取反加一
printf("%d, %d, %d", nValue1, chValue2, sValue3);
}
补码约定而已
十六进制到十进制
一个数据类型 占i个bit位
一个字节的0x72 => 0111 0010它所对应的
a
0
a_0
a0 就是0,而
a
1
a
4
a
5
a
6
a_1 a_4 a_5 a_6
a1a4a5a6 都是1. 在补码的编码方式中,最高位是符号位,其它位位数据位,最终的数值计算的公式, 是这样子的:
我们通过具体数字来展示: 比如,我们有一个char类型的数据,其值是0x85,那么它对应的数值,通过补码方式 计算,应该是:
0x 1000 0101
-1*2^(-7)+1*2^2+1*2^0=-128+5=-123
类型的 最高位 2进制是 1 还是 0 决定了这个数是正数还是负数。
比如 int 类型 是 0000 0000 如果1 xxx xxxx 是负数
那么反过来 十进制 要对应拿到 十六进制的 数据
绝对值取反加一
比如 char 类型-5
一个字节 一个字节占8位
-5=>5
0x05
二进制 0000 0101
取反 11111010
加一 1111 1011
十六进制 0xfb
```c
int -5
4个字节 占32位
一个字节两个空
也就是两个空 占8位
```c
0x00 00 00 05
0000 0000 0000 0000 0000 0000 0000 0101
取反加一
1111 1111 1111 1111 1111 1111 1111 1011
对应16进制为 0xFFFFFFFB
C语言的整型
表示负数 一般默认有补码的存在 char int short int 都支持默认存放整型变量,负数变量(通过最高位是否为1判断)
unsigned char unsigned int unsigned short int 他们里面只存正数。