第二章 变量和基本类型——2.1 基本内置类型((转)附录之C++中整型的超范围赋值问题)

转自自由不死的博文《C++中整型的超范围赋值问题》


在C++的标准中,是规定了每一个算术类型的最小存储空间的,但是该标准并不阻止编译器来使用更大的存储空间,而且事实上也正好如此,对于C++

的内置类型,几乎所有的编译器都使用了更大的存储空间来存储数据。---yyc

在C++中可以理解对象的类型决定了对象的取值范围,但是当我们在C++中试着把一个超出其取值范围的值赋值给该整型对象时,并不会报错,而是编译器

根据该类型是signed还是unsigned类型进行了一定的数据转换。

一、对于unsigned类型,编译器会调整越界值使其满足要求,编译器会自动将该值对unsigned类型的取值范围进行求模,然后取所得值:

例如如下两个例子:

For Example:

[cpp]  view plain  copy
  1. #include<iostream>  
  2. using namespace std;  
  3. int main() {  
  4.     unsigned char a ;  
  5.     a = 257;  
  6.     cout<<static_cast<int>(a)<<endl;  
  7.     //结果输出1  
  8.     a = 256;  
  9.     cout<<static_cast<int>(a)<<endl;  
  10.     //结果输出0  
  11.   return 0;  
  12. }  
特别值得说明的是:对于负数似乎总超过了unsigned类型的取值范围,但是事实上在C++中将负数赋值给unsigned类型是非常合法的。编译器也同样是将该负数

对该类型的取值范围求模,并将结果赋给unsigned对象。

例如:

[cpp]  view plain  copy
  1. #include<iostream>  
  2. using namespace std;  
  3. int main() {  
  4.     unsigned  a ;  
  5.     a = -1;  
  6.     cout<<a<<endl;  
  7.     //结果输出4294967295  
  8.     unsigned char b ;  
  9.     b = -1;  
  10.     cout<<static_cast<int>(b)<<endl;  
  11.     //结果输出255  
  12.   return 0;  
  13. }  

但是将负数赋值给unsigned类型对象在大多数的其他语言中却是非法的。

二、对于signed类型,将一个超过其取值范围的数赋值给signed的类型时,也不会报错,但是最后的取值却与编译器有关,不同的编译器可能会采取不同的

处理方法,但是大多数的编译器任然是采取和unsigned类型一样的处理方法,也就是对该类型的取值范围求模后的值。但是这中做法不能得到保证。。

[cpp]  view plain  copy
  1. #include<iostream>  
  2. using namespace std;  
  3. int main() {  
  4.     /* 
  5.     *signed char 的取值是从-128到127 
  6.     */  
  7.     signed char a ;  
  8.     a = -129;  
  9.     cout<<static_cast<int>(a)<<endl;  
  10.     //结果输出127  
  11.     signed char b ;  
  12.     b = 128;  
  13.     cout<<static_cast<int>(b)<<endl;  
  14.     //结果输出-127  
  15.   return 0;  
  16. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值