第二章 变量和基本类型——2.1 基本内置类型((转)附录之C++中整型的超范围赋值问题)
2017-02-14 09:31
447 查看
转自自由不死的博文《C++中整型的超范围赋值问题》
在C++的标准中,是规定了每一个算术类型的最小存储空间的,但是该标准并不阻止编译器来使用更大的存储空间,而且事实上也正好如此,对于C++
的内置类型,几乎所有的编译器都使用了更大的存储空间来存储数据。---yyc
在C++中可以理解对象的类型决定了对象的取值范围,但是当我们在C++中试着把一个超出其取值范围的值赋值给该整型对象时,并不会报错,而是编译器
根据该类型是signed还是unsigned类型进行了一定的数据转换。
一、对于unsigned类型,编译器会调整越界值使其满足要求,编译器会自动将该值对unsigned类型的取值范围进行求模,然后取所得值:
例如如下两个例子:
For Example:
[cpp] view
plain copy
#include<iostream>
using namespace std;
int main() {
unsigned char a ;
a = 257;
cout<<static_cast<int>(a)<<endl;
//结果输出1
a = 256;
cout<<static_cast<int>(a)<<endl;
//结果输出0
return 0;
}
特别值得说明的是:对于负数似乎总超过了unsigned类型的取值范围,但是事实上在C++中将负数赋值给unsigned类型是非常合法的。编译器也同样是将该负数
对该类型的取值范围求模,并将结果赋给unsigned对象。
例如:
[cpp] view
plain copy
#include<iostream>
using namespace std;
int main() {
unsigned a ;
a = -1;
cout<<a<<endl;
//结果输出4294967295
unsigned char b ;
b = -1;
cout<<static_cast<int>(b)<<endl;
//结果输出255
return 0;
}
但是将负数赋值给unsigned类型对象在大多数的其他语言中却是非法的。
二、对于signed类型,将一个超过其取值范围的数赋值给signed的类型时,也不会报错,但是最后的取值却与编译器有关,不同的编译器可能会采取不同的
处理方法,但是大多数的编译器任然是采取和unsigned类型一样的处理方法,也就是对该类型的取值范围求模后的值。但是这中做法不能得到保证。。
[cpp] view
plain copy
#include<iostream>
using namespace std;
int main() {
/*
*signed char 的取值是从-128到127
*/
signed char a ;
a = -129;
cout<<static_cast<int>(a)<<endl;
//结果输出127
signed char b ;
b = 128;
cout<<static_cast<int>(b)<<endl;
//结果输出-127
return 0;
}
在C++的标准中,是规定了每一个算术类型的最小存储空间的,但是该标准并不阻止编译器来使用更大的存储空间,而且事实上也正好如此,对于C++
的内置类型,几乎所有的编译器都使用了更大的存储空间来存储数据。---yyc
在C++中可以理解对象的类型决定了对象的取值范围,但是当我们在C++中试着把一个超出其取值范围的值赋值给该整型对象时,并不会报错,而是编译器
根据该类型是signed还是unsigned类型进行了一定的数据转换。
一、对于unsigned类型,编译器会调整越界值使其满足要求,编译器会自动将该值对unsigned类型的取值范围进行求模,然后取所得值:
例如如下两个例子:
For Example:
[cpp] view
plain copy
#include<iostream>
using namespace std;
int main() {
unsigned char a ;
a = 257;
cout<<static_cast<int>(a)<<endl;
//结果输出1
a = 256;
cout<<static_cast<int>(a)<<endl;
//结果输出0
return 0;
}
特别值得说明的是:对于负数似乎总超过了unsigned类型的取值范围,但是事实上在C++中将负数赋值给unsigned类型是非常合法的。编译器也同样是将该负数
对该类型的取值范围求模,并将结果赋给unsigned对象。
例如:
[cpp] view
plain copy
#include<iostream>
using namespace std;
int main() {
unsigned a ;
a = -1;
cout<<a<<endl;
//结果输出4294967295
unsigned char b ;
b = -1;
cout<<static_cast<int>(b)<<endl;
//结果输出255
return 0;
}
但是将负数赋值给unsigned类型对象在大多数的其他语言中却是非法的。
二、对于signed类型,将一个超过其取值范围的数赋值给signed的类型时,也不会报错,但是最后的取值却与编译器有关,不同的编译器可能会采取不同的
处理方法,但是大多数的编译器任然是采取和unsigned类型一样的处理方法,也就是对该类型的取值范围求模后的值。但是这中做法不能得到保证。。
[cpp] view
plain copy
#include<iostream>
using namespace std;
int main() {
/*
*signed char 的取值是从-128到127
*/
signed char a ;
a = -129;
cout<<static_cast<int>(a)<<endl;
//结果输出127
signed char b ;
b = 128;
cout<<static_cast<int>(b)<<endl;
//结果输出-127
return 0;
}
相关文章推荐
- 第二章 变量和基本类型——2.1 基本内置类型((转)附录之原码、反码和补码及其背后的数学之美)
- 第二章 变量和基本类型——2.1 基本内置类型
- C++primer 2.1 基本内置类型数据范围、机器级表示、赋值时候的数据类型隐式转换
- C++ Primer 笔记——第二章 变量和基本类型
- c++primer第二章变量与基本类型小结-2
- C++学习笔记 | 第二章 变量和基本类型 | (2)
- C++Primer第二章(变量和基本类型)笔记
- C++primer第4版第二章变量和基本类型
- C++学习笔记 | 第二章 变量和基本类型 | (1)
- C++ primer第二章:变量和基本类型
- C++学习笔记 | 第二章 变量和基本类型 | (3)
- C++中整型的超范围赋值问题
- C++学习笔记 | 第二章 变量和基本类型 | (5)
- C++学习笔记 | 第二章 变量和基本类型 | (4)
- C++基本数据类型大小及表示范围
- C++ Peimer 第2章-变量和基本类型习题答案
- C++基本类型的取值范围
- C++ Primer 第二章 变量和基本类型 笔记
- C++ Peimer 第2章-变量和基本类型习题答案
- 指针操作超越变量作用范围的问题(高质量c++)