用于确定有符号和无符号数据类型C++的范围的公式
Formula to determine the range of signed and unsigned data types C++
我刚开始学习C++(实际上是我的第二天),我被指派计算不同数据类型的范围,有符号和无符号。问题是,按照我学校的运作方式,我在接下来的几个月里都无法进入他教我们公式的数学部分。他说,要从已经上过数学课的人那里获得信息,但他们都说,他们将在家里做这方面的工作,那里有他们的笔记。所以,现在我被谷歌及其不确定的答案蒙在鼓里,所以我问你们,斯塔克夫弗洛的智者。
获取数据类型范围的公式是什么?我为INT找到了一个有效但不适用于其他的,他希望我们计算的是:char、short、long和long-long。他还想要这4以及INT.的未签名版本
我们已经掌握了每种数据类型的大小(以位和字节为单位)。
以下是我的INT范围布局:
printf ("nThe range of int is: %fn", pow(2, (sizeof(int) * CHAR_BIT) -1));
std::numeric_limits<T>
您可以使用以下函数获得这些限制的实际值:
T std::numeric_limits<T>::min()
T std::numeric_limits<T>::max()
可以用适当的类型代替T
,例如signed char
或unsigned char
。
公式
具有N位的有符号数(使用2的补码)的公式是
- min=-1*2N-1
- max=2N-1-1
具有N位的无符号数的公式是
- 最小值=0
- max=2N-1
示例:8位char
CCD_ 8具有N=8个比特。让我们用signed char
和unsigned char
来验证这些公式。
signed char
- min=-1*2N-1=-1*27=-128
- max=2N-1-1=27-1=127
unsigned char
- 最小值=0
- max=2N-1=28-1-255
实际上,这些范围可以在<limits>
中找到-请参阅参考,特别是模板std::numeric_limits
-请参阅此处。不过,我假设你想知道这些数字是从哪里来的。
重要的是比特的数量。如果您有n
位,那么您可以用它们来表示2n不同的值。取一个老派的16位整数。对于16位,可能的不同值的数量是216=65536。如果你有一个无符号的值,你只表达非负值。因此,您表示的最小值是0,最大值是2n-1,因此一个16位无符号整数从0
变为65535
。
如果用符号表示整数,那么现在当然有相同数量的值(上一个例子中为65536)来表示一些正数和负数。在中间有0
,然后将剩余的值分为负值和正值。所以你在低端得到-32768
,在高端得到32767
。
对于任何其他表示整数的数据类型,无论是32位、64位还是更多位,都是相同的模式。
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- 在基于范围的for循环中使用结构化绑定声明
- 如何计算数据类型的范围,例如int
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 在C++中查找范围的长度
- 如何设置一个范围来提取我想要获得的信息
- 并行用于C++17中数组索引范围内的循环
- 为左值和右值的包装器实现C++范围
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 超出范围时使用对象
- 不计算一个范围内的完美数
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 如何访问超出其块范围的对象?
- 矢量下标超出SFML游戏中的范围