(unsigned)short溢出后隐式转换为int

同学被面试官问到一个细节中的细节,虽然个人觉得意义不大,但还是好奇并在和同学一起实验后搞清楚了,记录一下

如下:

int main() {
	unsigned short a = 65535, b = 10;
	for (int i = 0; i < a + b; i ++ )
		cout << "hello world!" << endl;
	return 0;
}

问:现象

不卖关子:现象是打印了65545行"hello world!"。起初十分费解,a和b都是short,返回值应该也是short吧,怎么会大于65535?!

一通探究后,发现了这些:

image

#include <iostream>

int main() {
    short a = 32767, b = 10;
    auto c = a + b;
    std::cout << c << std::endl;  // 32777

    unsigned short d = 65535, e = 10;
    auto f = d + e;
    std::cout << f << std::endl;  // 65545

    int g = 2147483647;
    auto h = g + 1;
    std::cout << h << std::endl;  // -2147483648: 10000000 00000000 00000000 00000000

    unsigned int i = 4294967295;
    auto j = i + 1;
    std::cout << j << std::endl;  // 0

    return 0;
}

总结一下就是

shortunsigned short会在溢出后自动的隐式类型转换为int

intunsigned int并不会自动转换为long long

只能说这太细了,工作中遇到了再实验不也是简简单单?没实验过的人能掌握这么细吗?拿这个来作为考察内容之一合适吗?就别提海那边不问八股文的笔试、面试风格了。

posted @ 2023-02-28 04:54  可奇  阅读(476)  评论(0)    收藏  举报