猿问

为什么在C和C+中的算术运算之前必须将短时间转换为int?

为什么在C和C+中的算术运算之前必须将短时间转换为int?

从我得到的答案这个问题,看来C+继承了将shortint在C进行算术运算的时候,我可以选一下你的大脑吗?为什么这最初是在C中引入的吗?为什么不把这些操作short?

例如(摘自DYP在评论中的建议):

short s = 1, t = 2 ;auto  x = s + t ;

x会有类型的INT.


弑天下
浏览 422回答 3
3回答

不负相思意

short和char类型被标准类型的“存储类型”所考虑,即您可以使用的子范围来节省一些空间,但这不会给您带来任何速度,因为它们的大小对于CPU来说是“不自然的”。在某些CPU上,这是不正确的,但是优秀的编译器足够聪明地注意到,如果您向一个未签名的字符添加一个常量并将结果存储回一个无符号字符中,那么就没有必要通过unsigned char -> int转换。的内环生成的代码,例如,使用g+生成的代码。void&nbsp;incbuf(unsigned&nbsp;char&nbsp;*buf,&nbsp;int&nbsp;size)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i<size;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[i]&nbsp;=&nbsp;buf[i]&nbsp;+&nbsp;1; &nbsp;&nbsp;&nbsp;&nbsp;}}只是.L3: &nbsp;&nbsp;&nbsp;&nbsp;addb&nbsp;&nbsp;&nbsp;&nbsp;$1,&nbsp;(%rdi,%rax) &nbsp;&nbsp;&nbsp;&nbsp;addq&nbsp;&nbsp;&nbsp;&nbsp;$1,&nbsp;%rax &nbsp;&nbsp;&nbsp;&nbsp;cmpl&nbsp;&nbsp;&nbsp;&nbsp;%eax,&nbsp;%esi &nbsp;&nbsp;&nbsp;&nbsp;jg&nbsp;&nbsp;.L3.L1:其中可以看到一个未签名的char加法指令(addb)使用。如果在短INT之间进行计算并将结果存储在短INT中,也会发生同样的情况。

哆啦的时光机

与其说它是语言的一个特性,不如说它是运行代码的物理处理器体系结构的限制。这个intC中的Typer通常是标准CPU寄存器的大小。更多的硅占用更多的空间和更多的能量,因此在许多情况下,算术只能在“自然大小”数据类型上进行。这并不是普遍正确的,但大多数体系结构仍然存在这一限制。换句话说,当添加两个8位数字时,处理器中实际上发生的是某种类型的32位算术,后面跟着一个简单的位掩码或另一个适当的类型转换。
随时随地看视频慕课网APP
我要回答