微软VC编译器对signed类型超出取值范围的处理

今天在读C++Primer时有这么一句话:对象的类型决定对象的取值。这会引起一个疑问:当我们试着把一个超出其取值范围的值赋给一个指定类型的对象时,结果会怎样呢?答案取决于这种类型是signed还是unsigned。

对于unsigned类型来说,编译器将会对unsigned类型求模,直到满足范围为止;对于signed类型来说,由编译器决定实际赋予的值,在实践操作中,很多编译器处理signed类型与unsigned类型类似。

      那么对于我们常用的C/C++编译器 VC;编译器是如何处理signed类型的呢?

      对于常见的整型int(是一种signed类型)有如下例子:

#include
using namespace std;
int main(){
	int n=379997532212;
	cout<

微软VC编译器对signed类型超出取值范围的处理_第1张图片

int类型在VC中由4个字节表示,因此取值范围为-2147483648-2147483647

显然379997532212已经超出范围了,输出结果(379997532212)%(2147483648)=2040410164

这种处理方法相当于直接由低位到高位赋值,超出的部分舍去;

(379997532212)10=(0101 1000 0111 1001 1001 1110 0011 0000 0011 0100)2

(2040410164)10=(0111 1001 1001 1110 0011 0000 0011 0100)2

由此可见VC对signed类型超出取值范围的处理与unsigned是一样的

你可能感兴趣的:(C/C++,c语言c++,C,编译器,微软,vc)