怎么理解符号整数的取值范围(C++)
2009-06-08 17:36
295 查看
之前我们讨论到了整数有区分符号的,也就是有正负数之分。一个典型的整数,如char。有符号和没有符号,取值范围是不一样的
1. 有符号的char : 取值范围为-128~127
2. 无符号的char : 取值范围为0~255
首先看无符号的
1. 为什么最小为0: 0000 0000 当然是0
2. 为什么最大是255 : 1111 1111当然是255
这个很好理解。
然后来看有符号的。C++标准中并没有规定如何处理符号,这个问题一般都是由各个编译器决定怎么处理。通常情况下的做法都是用一个位作为符号位。这个符号位如果为1,则为负数,这个符号位如果为0,则为0或者正数。
1. 为什么最小为-128?
那么,如果说赋予给数值的值超过了范围呢?会怎么样呢?
一般都是这样处理:将实际的数值求256的模,然后返回。例如给出的300,则实际上代表的是300%256,也就是多少呢
为了演示这个效果,我写了一段小的程序
#include <iostream>
using namespace std; int main()
{ int v=255;
for(int n=65;n<123;n++)
{
for(int m=0;m<5;m++)
{
cout<< (char)(m*256+n-1)<<" ";
}
cout<<endl;
}
return 0;
}
看这个例子就知道,其实就是每隔256,又重复一遍。那么就说明什么呢?
但是,同样的代码在C#中的显示却很怪异,不知道该如何解释了。我们看到第二列开始并没有按照预期地出现想要的字符。又不全部是问号,诡异。。
1. 有符号的char : 取值范围为-128~127
2. 无符号的char : 取值范围为0~255
首先看无符号的
1. 为什么最小为0: 0000 0000 当然是0
2. 为什么最大是255 : 1111 1111当然是255
这个很好理解。
然后来看有符号的。C++标准中并没有规定如何处理符号,这个问题一般都是由各个编译器决定怎么处理。通常情况下的做法都是用一个位作为符号位。这个符号位如果为1,则为负数,这个符号位如果为0,则为0或者正数。
1. 为什么最小为-128?
1 111 1111
第一个1表示负数,后面7个1为127.所以应该是-127的。为什么说是-128呢?可能有的编译器是这样决定的:因为0~127之间,一共是128个数字。然后负数方面呢,就不需要考虑0了,因为0已经表示过了,其实就是(00000000),它不可能再用一个(1000000)去表示另外一个零,这毫无意义。所以,在负数方面也要128个数,加起来才是256个数。那么从-1到-128正好是128个数。
2. 为什么最大为127?第一个1表示负数,后面7个1为127.所以应该是-127的。为什么说是-128呢?可能有的编译器是这样决定的:因为0~127之间,一共是128个数字。然后负数方面呢,就不需要考虑0了,因为0已经表示过了,其实就是(00000000),它不可能再用一个(1000000)去表示另外一个零,这毫无意义。所以,在负数方面也要128个数,加起来才是256个数。那么从-1到-128正好是128个数。
0 111 1111 这肯定是127.
那么,如果说赋予给数值的值超过了范围呢?会怎么样呢?
一般都是这样处理:将实际的数值求256的模,然后返回。例如给出的300,则实际上代表的是300%256,也就是多少呢
为了演示这个效果,我写了一段小的程序
#include <iostream>
using namespace std; int main()
{ int v=255;
for(int n=65;n<123;n++)
{
for(int m=0;m<5;m++)
{
cout<< (char)(m*256+n-1)<<" ";
}
cout<<endl;
}
return 0;
}
看这个例子就知道,其实就是每隔256,又重复一遍。那么就说明什么呢?
但是,同样的代码在C#中的显示却很怪异,不知道该如何解释了。我们看到第二列开始并没有按照预期地出现想要的字符。又不全部是问号,诡异。。
相关文章推荐
- 怎么理解符号整数的取值范围(C++)
- C++中有符号整数的取值范围
- C++ - 一个非递减数组,下标从0到n,元素的取值范围为从0到n的整数,判断其中是否有重复元素
- C语言之有符号无符号整数取值范围
- 怎么计算c++中各个数据类型的取值范围
- 怎么计算c++中各个数据类型的取值范围
- c++中指向指针的指针怎么理解?
- 关于有符号整型int最小值的取值理解
- (整理)c++中找出各种数据类型的取值范围
- 给定一个整数数组,其中元素的取值范围为0到10000,求其中出现次数最多的数
- 关于Java中Byte类型的取值范围的理解
- 数据类型范围,有符号类型无符号类型,正负, 反码补码的终极理解,一看就懂
- C++Primer笔记(一):C++基本数据类型及其取值范围
- C++实现在一段取值范围内输出不相同的随机数
- java学习总结(16.05.17)对数据类型取值范围和数据溢出的理解(以byte类型为例)
- C++各数据类型取值范围
- C/C++中int、long、long long取值范围
- c++内置数据类型的取值范围和大小总结
- 关于Java中Byte类型的取值范围是-128~127的理解
- C++中基本数据类型字节数及取值范围,下面有实现查看代码和运行截图