我无法弄清楚如何在不使用 climits 的情况下计算最大和最小有符号数C++
I can't figure out how to calculate the maximum and minimum signed number without using climits in C++
我目前正在为我的CS课程做作业。我正在尝试打印 int、short 和 long 数据类型的最大和最小有符号数。
我不完全确定该怎么做。我一直在使用 sizeof() 函数来确定每种数据类型携带多少字节,然后使用 cmath 库中的 pow()。
这是我用于计算签名短头最大数量的数学/代码:(int)pow(2, sizeof(short)*8)-1;
这将输出最大无符号数,而不是最大有符号数。我可以将其除以 2,但不完全确定如何计算负部分,而不是在前面打印"-"。
我现在拥有的更详细的代码:
42 int shortmax_calculate;
43 shortmax_calculate = (pow(2, sizeof(short)*8)-1)/2;
44
45 float shortmin_calculate;
46 shortmin_calculate = (int)pow(2, sizeof(short)*8)/2;
47
48 short unsigned shortunsigned_calculate;
49 shortunsigned_calculate = pow(2, sizeof(short)*8)-1;
50
51 int intmax_calculate;
52 intmax_calculate = (int)pow(2, sizeof(int)*8)-1;
53
54
55 cout << "Maxmimum short (signed): "<< shortmax_calculate << endl;
56 cout << "Minimum short (signed): " << "-" << shortmin_calculate << endl;
57 cout << "Maximum short (unsigned): " << shortunsigned_calculate << endl;
58 cout << "Maximum int (signed): " << intmax_calculate << endl;
任何帮助不胜感激,谢谢。
假设您可以使用 C++11,请使用限制标准标头:
#include <iostream>
#include <limits>
...
{
std::cout << "Maxmimum short (signed): " <<
std::numeric_limits<short>::max() << std::endl;
// repeat replacing with 'unsigned short', 'int', 'unsigned int'
// in template class function: std::numeric_limits<type>, using
// max() or min() as required.
}
看看 clang 的实现 - 搜索__libcpp_numeric_limits
看看它是如何进行评估的。如果您不能使用 C++11,它可能会为您提供一些模板的想法。
在 2 的补码中,-1 将设置所有位。如果将其转换为无符号并将其右移 1,它将是可能的最大有符号数字,因为符号位将被替换为零。如果采用其按位逆数,它将是可能的最小负数。
short shortmax_calculate = static_cast<short>(static_cast<unsigned short>(-1) >> 1);
short shortmin_calculate = ~shortmax_calculate;
所以我认为你正在寻找的只是在你计算的最大值上添加一个。我在下面修改了你的代码(对不起,它在 C 中)。
short shortmax_calculate;
shortmax_calculate = (pow(2, sizeof(short)*8)-1)/2;
short shortmin_calculate;
shortmin_calculate = shortmax_calculate + 1;
short unsigned shortunsigned_calculate;
shortunsigned_calculate = pow(2, sizeof(short)*8)-1;
int intmax_calculate;
intmax_calculate = (int)pow(2, sizeof(int)*8)-1;
int intmin_calculate = intmax_calculate + 1;
printf("Maximum short (signed): %in",shortmax_calculate);
printf("Minimum short (signed): %in",shortmin_calculate);
printf("Maximum short (unsigned): %in", shortunsigned_calculate);
printf("Maximum int (signed): %in", intmax_calculate);
printf("Minimum int (signed): %in", intmin_calculate);
下面是代码的输出:
Maximum short (signed): 32767
Minimum short (signed): -32768
Maximum short (unsigned): 65535
Maximum int (signed): 2147483647
Minimum int (signed): -2147483648
这是因为计算机存储负数的方式。例如:最大短(带符号)是01111111即 127。最小签名存储为 10000000 (−128)。有关详细信息,请参阅此链接。
一些模板代码就可以完成这项工作。
#include <iostream>
#include <cstdint>
template <size_t S> struct Max
{
static intmax_t get()
{
return ((Max<S-1>::get() << 8) + 0xFF);
}
};
template <> struct Max<1>
{
static intmax_t get()
{
return 0x7F;
}
};
template <size_t S> struct Min
{
static intmax_t get()
{
return ((Min<S-1>::get() << 8));
}
};
template <> struct Min<1>
{
static intmax_t get()
{
return -0x80;
}
};
int main()
{
std::cout << "Max for int: " << Max<sizeof(int)>::get() << std::endl;
std::cout << "Min for int: " << Min<sizeof(int)>::get() << std::endl;
std::cout << "Max for short: " << Max<sizeof(short)>::get() << std::endl;
std::cout << "Min for short: " << Min<sizeof(short)>::get() << std::endl;
std::cout << "Max for signed char: " << Max<sizeof(signed char)>::get() << std::endl;
std::cout << "Min for signed char: " << Min<sizeof(signed char)>::get() << std::endl;
}
这是我在机器上得到的:
整数最大值:2147483647int 的最小值: -2147483648简称最大值:32767最小简称:-32768签名字符的最大数量:127签名字符的最小值:-128
相关文章:
- 在C++中如何在没有pow的情况下进行基础计算
- 如何在不使用乘除运算符的情况下计算 A 的 B 次幂?
- 有没有一种惯用的方法可以在不存储变换或不必要地重新计算的情况下找到数组变换的最小/最大值?
- C++在不使用pow或循环的情况下计算一个数字的幂
- 如何在不导致堆栈溢出的情况下计算非常大的数字和很小的 HCF.我正在使用欧几里得算法
- 在没有查找表的情况下计算大数的位长度
- 在不创建子矩阵的情况下计算C++矩阵的行列式
- 如何在不使用提取操作员的情况下计算TXT文件中的数量数
- 递归计算在不使用静态局部变量,全局变量或静态函数的情况下,在递归函数中发生的环数
- 在不损失C++或 Python 性能的情况下计算 pi
- 如何在不使用loop或std :: comguate()的情况下计算向量的总和
- 程序不会降低最低分数并在没有它的情况下计算平均值
- 如何遍历二叉树并在不传递值的情况下计算值的出现次数
- 在不使用 strlen() 的情况下计算字符串中的字母
- 在没有外部库的情况下C++计算大量数字
- 在不使用c++中的库函数的情况下,计算不包括null字符的字符串长度
- 尝试在没有opencv calcHist()的情况下计算我自己的直方图
- 一种计算技巧,例如,在每个盒子可以容纳M个物体的情况下,放置N个物体所需的盒子数量
- 如何在没有数学的情况下计算第 n 个根
- 在不使用函数 pow 的情况下计算表达式的总和