1.整型提升
C语⾔中整型算术运算总是⾄少以缺省(默认)整型类型的精度来进⾏的。 为了获得这个精度,表达式中的字符和短整型操作数在使⽤之前被转换为普通整型,这种转换称为整 型提升。
char a,b,c; ...
a = b + c;
b和c的值被提升为普通整型,然后再执⾏加法运算。 加法运算完成之后,结果将被截断,然后再存储于a中。
如何进⾏整体提升呢?
1. 有符号整数提升是按照变量的数据类型的符号位来提升的
2. ⽆符号整数提升,⾼位补0
#include <stdio.h>
int main()
{
char a = 10;//char 是有符号的char
//00000000000000000000000000001010
//00001010 - a
char b = 130;
//00000000000000000000000010000010
//10000010 - b
char c = a + b;
//10000010这里整形提升按照变量的符号位提升
//11111111111111111111111110000010提升后的b
//00000000000000000000000000001010 提升后的a
//11111111111111111111111110001010 a+b 的补码
//10000000000000000000000001110101 反码
//10000000000000000000000001110110 原码
//因为c是char类型 所以只能存一个字节,
// 01110110 就是c 的值 因为是负值
printf("%d ", c); //-116
return 0;
}
总结
即使有了操作符的优先级和结合性,我们写出的表达式依然有可能不能通过操作符的属性确定唯⼀的 计算路径,那这个表达式就是存在潜在⻛险的,建议不要写出特别复杂的表达式
2.深⼊理解指针(1)
2.1. 内存和地址
1.1 内存
假设有⼀栋宿舍楼,把你放在楼⾥,楼上有100个房间,但是房间没有编号,你的⼀个朋友来找你玩, 如果想找到你,就得挨个房⼦去找,这样效率很低,但是我们如果根据楼层和楼层的房间的情况,给 每个房间编上号
其实也是把内存划分为⼀个个的内存单元,每个内存单元的⼤⼩取1个字节。
内存单元的编号 == 地址 == 指针
2.2 究竟该如何理解编址
CPU访问内存中的某个字节空间,必须知道这个 字节空间在内存的什么位置,⽽因为内存中字节 很多,所以需要给内存进⾏编址(就如同宿舍很 多,需要给宿舍编号⼀样)。
但是硬件与硬件之间是互相独⽴的,那么如何通 信呢?答案很简单,⽤"线"连起来。 ⽽CPU和内存之间也是有⼤量的数据交互的,所 以,两者必须也⽤线连起来。 不过,我们今天关⼼⼀组线,叫做地址总线
我们可以简单理解,32位机器有32根地址总线, 每根线只有两态,表⽰0,1【电脉冲有⽆】,那么 ⼀根线,就能表⽰2种含义,2根线就能表⽰4种含 义,依次类推。32根地址线,就能表⽰2^32种含 义,每⼀种含义都代表⼀个地址。 地址信息被下达给内存,在内存上,就可以找到 该地址对应的数据,将数据在通过数据总线传⼊ CPU内寄存器。
2.3指针变量和地址
2.3.1取地址操作符(&)
在C语⾔中创建变量其实就是向内存申请空间,
%p是用来打印地址的,可以通过上面的调试找到内存来观察, 如果忘记了怎么操做可以看我以前的笔记VS实⽤调试技巧-CSDN博客 链接放这里啦
#include <stdio.h>
int main()
{
int a = 100;
int* pa = &a; //这里的pa是变量, 因为类型是 int * 存放的是地址(指针)
//,所以pa叫指针变量
//int 表示pa指向的变量a 的类型是int
return 0;
}
2.3.2解引⽤操作符
C语⾔中其实也是⼀样的,我们只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针) 指向的对象,这⾥必须学习⼀个操作符叫解引⽤操作符(*)
#include <stdio.h>
int main()
{
int a = 0;
int* pa = &a;
* pa = 0; //这里的 * 号是解引用操作符
return 0;