一直以来,关于在overflow和underflow这方面,自己都没有怎么去关注。最近看了CSAPP,然后又在这方面吃了几次亏,比如使用C++中的vector,vector.size() 返回的就是unsigned。所以,在使用这方面时,要比较注意。
总结如下:
对于unsigned和signed进行比较时,编译器会把signed转换为unsigned。转换规则非常简单:编译器不会真的去把一个数的bit进行改变,而是使用不同的规则去解读这个数。这个因为如此,如对于-1这个数,在没有转换为unsigned之前,它在计算机中存储如下:
`1111 1111 1111 1111 1111 1111 1111 1111
我们知道,这样就是反码-1的表示。但如果将其转换成unsigned,那么其对应的bit仍如上,但是这时,计算机就是使用原码的规则去解读上面的bit串。所以解读出来就是
2^32-1
同样的,对于unsigned转换成signed也是运用这个规则。
//TODO 补上CSAPP的图
本文讨论了在编程中遇到的整数溢出(overflow)和下溢(underflow)问题,特别是针对C++中unsigned和signed类型转换时需要注意的问题。通过具体的例子解释了这些类型在转换过程中如何被编译器处理。
7717

被折叠的 条评论
为什么被折叠?



