如何理解下面这段话,第二段为什么会说是short被转换给了int?

short chickens=20;
short ducks=35;
short fowl=chickens+ducks;
为执行第三条语句,程序先取得chickens和ducks的值并转换为int;然后程序将结果转换为short类型(将转换的int值赋给short类型的变量)
【还有其他一些整型提升:如果short比int短,则unsigned short类型将被转换为int;如果两种类型的长度相同,则unsigned short类型将被转换为unsigned int。这种规则确保了在对unsigned short进行提升时不会损失数据。】
【】里面的第二段话我看不明白,第一段话说自动转换先将变量值转换为int整型,然后再把int转换赋值给short。第二段为什么会说是short被转换给了int?这太跳跃了我完全没有头绪

慕尼黑5688855
浏览 166回答 1
1回答

BIG阳

书上的话好理解,你问的问题有点深奥,听不明白。我只能把书上的话翻译一遍。short fowl=chickens+ducks; 这句话看起来是一个简单的加法,却做了几件事情。一、把2字节的chickens和ducks分别转换成4字节的“有符号整数”,即转换成int(如图中的两个movsx指令)。然后做加法(图中的add指令),最后把加的结果转换成2字节后赋给fowl(图中最后一句mov,此处的(类型)转换就是取寄存器eax的低16位赋给了fowl)。书上说的提升,一般可以理解为变量所占内存的大小有所改变,如2字节变为了4字节。这时候,编译器会对这个变量做(有符号或无符号的)扩展。如使用movsx指令,指令中的s即表示有符号之意。相应的,还有零扩展指令movzx,这个可以用于对无符号整数作扩展。【】里说明了,当short(所占内存空间)的大小比int小时,unsigned short会转换成int;如果相同时,unsigned short将转换成unsigned int。“不会损失数据”指的是变量的所有位在扩展后都保留下来了,没有丢失任何位。相反地,int转换成short,往往在由大转换成小时丢失位数,因为装不下了。我这里所说的大小指的是所占内存的多少,即所占字节的多少,而不是指5>4这种含义的大小。
打开App,查看更多内容
随时随地看视频慕课网APP