C05-基本数据类型在内存中的表现形式

游戏即时获得用户输入

_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 他们里面只存正数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值