Heartstopper也是很多像桃酥和Issac这样"outsider"的safe place吧,拥有音乐,电影和读书这些只能在小圈子里才比较自由自在的爱好,所以浮于多数人的团体之外。
而这部剧让人(比如我)心安的理由在于尽管桃酥和Char和Elle喜欢不一样的电影, Char 跨出了自己圈子加入rugby team去比赛,好友看不懂规则也要站在场外为Char紧张,Issac在玩大富翁最后直接睡着,但他们还是拉住彼此,守住自己珍视的圈子,给朋友最大的支持和信任。
平衡感好的Friendship对成年人来说也未免太precious了。
而这部剧让人(比如我)心安的理由在于尽管桃酥和Char和Elle喜欢不一样的电影, Char 跨出了自己圈子加入rugby team去比赛,好友看不懂规则也要站在场外为Char紧张,Issac在玩大富翁最后直接睡着,但他们还是拉住彼此,守住自己珍视的圈子,给朋友最大的支持和信任。
平衡感好的Friendship对成年人来说也未免太precious了。
类型转换
1.问题,C语言中有很多不同数据类型,eg:float,int可以转换么?
当然可以
类型转换方式:1.强制类型转换【程序猿的转换】
2. 隐式类型转换 【编译器转换】
eg
#include
int main()
{
long l=800;
int i=(int)l;//强制类型转换
return 0;
}
#include
int main()
{
short s=800;
int i=s;//隐式类型转换,no error no warning
return 0;
}
一.强制类型转换的语法
——(Type)var-name;
——(Type)value;
强制类型转换的结果
1.当目标能够容纳目标值:转换结果不变【看内存字节eg short 像int转换不会损坏结果
2当目标不能够容纳目标值时,转换结果会被截断【eg int像short转换】
注意事项:并非所有的强制类型转换都能成功,转换不成功时,编译器会出现编译错误
产生错误信息
验证代码
#include
struct XJ
{
};
int i;
int j;
struct XJ xj;
int main()
{
short s=0x1122;
char c=(char)s;//0x22 [zhiyouyigezijie]jieduan
int i=(int)s;//0x1122[rongliangshao xiangduo zhuanhuan bujieduan]
int j=(int)3.1415;//3fudianshu jieduan
unsigned int p=(unsigned int)&xj;//64wei caozuoxitong buxing
long l=(long)xj;//error
xj =(struct XJ)l;//error
printf("s=%x\n",s);
printf("c=%d\n",c);
printf("i=%x\n",i);
printf("j=%x\n",j);
printf("p=%x\n",p);
printf("&xj=%p\n",&xj);
return 0;
}
已验证编译通过,且与预计一致。
二隐式类型转换
【编译器主动进行的转换】
有时,编译器的主动隐式类型转换会产生bug
eg
charc =0;//变量c占用一个字节
short s=c;//c到s的隐式类型转换
inti=s;//s到i的隐式类型转换
longl=i;//i到l的隐式类型转换
注意事项:低类型到高类型的隐式类型转换是安全的,【不会产生截断】
高类型到低类型的隐式类型转换,是不安全的,会导不正确的结果;
隐式类型转换一般发生地点:
1.算术运算式中低类型到高类型;
2.赋值表达式中,表达式的值转化为左边变量的类型
3.函数调用时,实参转化为形参时
4.函数返回值,return表示的函数返回值类型
能成功转换的条件:
看图1
char>>int>>unsigned int >>long>>unsigned long>>float>>double【后面两种为特殊情况】
2. char>>short>>int
实验验证代码(2)
#include
int main()
{
char c='a';
int i=c;//safe xiaozhuan da
unsigned int j=0x11223344;
short s=j;//da zhuan xiao yinxingzhuanhuan unsafe
printf("c=%x\n",c);
printf("i=%x\n",i);
printf("j=%x\n",j);
printf("s=%x\n",s);
printf("(int)sizeof(c+s)=%d\n",(int)sizeof(c=s));
return 0;
}
已编译通过
三.小结
强制类型转换
1.由程序猿负责完成【可以高向低,也可以低向高】,
2.转换不成功时,编译器给出错误信息
隐式类型转换
1.低类型向高类型转换是安全的
2.高类型向低类型不安全
c语言弊端,由于比较宽松,隐式类型转换可能会带来意料之外的错误
1.问题,C语言中有很多不同数据类型,eg:float,int可以转换么?
当然可以
类型转换方式:1.强制类型转换【程序猿的转换】
2. 隐式类型转换 【编译器转换】
eg
#include
int main()
{
long l=800;
int i=(int)l;//强制类型转换
return 0;
}
#include
int main()
{
short s=800;
int i=s;//隐式类型转换,no error no warning
return 0;
}
一.强制类型转换的语法
——(Type)var-name;
——(Type)value;
强制类型转换的结果
1.当目标能够容纳目标值:转换结果不变【看内存字节eg short 像int转换不会损坏结果
2当目标不能够容纳目标值时,转换结果会被截断【eg int像short转换】
注意事项:并非所有的强制类型转换都能成功,转换不成功时,编译器会出现编译错误
产生错误信息
验证代码
#include
struct XJ
{
};
int i;
int j;
struct XJ xj;
int main()
{
short s=0x1122;
char c=(char)s;//0x22 [zhiyouyigezijie]jieduan
int i=(int)s;//0x1122[rongliangshao xiangduo zhuanhuan bujieduan]
int j=(int)3.1415;//3fudianshu jieduan
unsigned int p=(unsigned int)&xj;//64wei caozuoxitong buxing
long l=(long)xj;//error
xj =(struct XJ)l;//error
printf("s=%x\n",s);
printf("c=%d\n",c);
printf("i=%x\n",i);
printf("j=%x\n",j);
printf("p=%x\n",p);
printf("&xj=%p\n",&xj);
return 0;
}
已验证编译通过,且与预计一致。
二隐式类型转换
【编译器主动进行的转换】
有时,编译器的主动隐式类型转换会产生bug
eg
charc =0;//变量c占用一个字节
short s=c;//c到s的隐式类型转换
inti=s;//s到i的隐式类型转换
longl=i;//i到l的隐式类型转换
注意事项:低类型到高类型的隐式类型转换是安全的,【不会产生截断】
高类型到低类型的隐式类型转换,是不安全的,会导不正确的结果;
隐式类型转换一般发生地点:
1.算术运算式中低类型到高类型;
2.赋值表达式中,表达式的值转化为左边变量的类型
3.函数调用时,实参转化为形参时
4.函数返回值,return表示的函数返回值类型
能成功转换的条件:
看图1
char>>int>>unsigned int >>long>>unsigned long>>float>>double【后面两种为特殊情况】
2. char>>short>>int
实验验证代码(2)
#include
int main()
{
char c='a';
int i=c;//safe xiaozhuan da
unsigned int j=0x11223344;
short s=j;//da zhuan xiao yinxingzhuanhuan unsafe
printf("c=%x\n",c);
printf("i=%x\n",i);
printf("j=%x\n",j);
printf("s=%x\n",s);
printf("(int)sizeof(c+s)=%d\n",(int)sizeof(c=s));
return 0;
}
已编译通过
三.小结
强制类型转换
1.由程序猿负责完成【可以高向低,也可以低向高】,
2.转换不成功时,编译器给出错误信息
隐式类型转换
1.低类型向高类型转换是安全的
2.高类型向低类型不安全
c语言弊端,由于比较宽松,隐式类型转换可能会带来意料之外的错误
函数f2: 这是调用Dump()来获取内存转储(memory dump)的函数,因此我们可很容易地定位输出数据中的参数和局部变量、初始化值代表变量名。例如,f2()的第一个变量名称为f2v1,并且使用0x31763266初始化,因为:
66 =字符f的ASCII码(低字节,存储在最低地址)
32 =字符2的ASCII码
76 =字符v的ASCII码
31 =字符1的ASCII代码(高字节,根据小端编码存储在最高地址处),因此搜索这个变量很容易:我们必须搜索字节序列66327631或在左列,字符串“f2v1”。f2()的变量bp包含getBP()返回的地址;因此(如本章前面的“栈帧”中所讨论的)* f1()的栈帧内的bp点。
我们注意到由于变量BP已被声明为无符号char*类型,被引用的对象*bp是有无符号char*类型;因此,设bp作为指针,我们需要一个转换:*(unsigned char **)bp。以类似的方式,
**bp需要一个转换:**(unsigned char ***)bp。**bp指向堆栈帧main()内的栈帧。图5-11显示动态链接,包括服务函数。
66 =字符f的ASCII码(低字节,存储在最低地址)
32 =字符2的ASCII码
76 =字符v的ASCII码
31 =字符1的ASCII代码(高字节,根据小端编码存储在最高地址处),因此搜索这个变量很容易:我们必须搜索字节序列66327631或在左列,字符串“f2v1”。f2()的变量bp包含getBP()返回的地址;因此(如本章前面的“栈帧”中所讨论的)* f1()的栈帧内的bp点。
我们注意到由于变量BP已被声明为无符号char*类型,被引用的对象*bp是有无符号char*类型;因此,设bp作为指针,我们需要一个转换:*(unsigned char **)bp。以类似的方式,
**bp需要一个转换:**(unsigned char ***)bp。**bp指向堆栈帧main()内的栈帧。图5-11显示动态链接,包括服务函数。
✋热门推荐