跨平台C++确定最大整数值(无标题)

Grz*_*cki -2 c++ architecture cross-platform metaprogramming

根据编译器体系结构,使C++函数或结构,类(使用元编程)确定有符号和无符号类型的最大值.一个用于签名,另一个用于无符号数字.

要求:

  • 没有头文件
  • 自我调整到可变大小(没有stdint.h)
  • 没有关于可能溢出的编译器警告

澄清:

评论后,我很惊讶,对非典型的C++问题的反应.我已经知道强调这个问题很好,这个问题不是家庭作业,也不是来自月球,但它是实用的领域.

对于所有感兴趣的应用这些东西...首先:它不是功课:).这是基于我所面临的实际问题实用,可回答的问题 - 如SO.FAQ所建议的那样.感谢您提供有关climits等的提示,但我正在寻找"智能代码".当然climits,limits经过良好测试和良好的代码片段,但它们是巨大的,不一定"聪明,棘手".我们正在寻找智能解决方案(不是"巨大的任何"解决方案),不是吗?即使你,climits建议也没关系,作为起点.对于那些对区域感兴趣的人,其中包括头文件是不允许的,并且源代码的大小是相关的,很少有:编译器的实验,程序转换,为编程竞赛准备问题集等.实际上它们的树与问题有关I我目前正在努力.所以我不认为(SO.FAQ)过于本地化,我认为,对于(SO.FAQ)爱好者程序员来说,这是肯定的问题.如果您认为即使所有这些,这个问题都有问题,请告诉我 - 我不想再犯错误.如果没关系,请告诉我,我能做些什么来不让它失败?

chi*_*ill 5

在两个补码表示的合理假设下:

template<typename T> struct maxval;

template<> struct maxval<unsigned char>
{
  static const unsigned char value = (unsigned char) ~0;
};

template<> struct maxval<signed char>
{
  static const signed char value = ((unsigned char) ~0) >> 1;
};

template<> struct maxval<unsigned short>
{
  static const unsigned short value = (unsigned short) ~0;
};

template<> struct maxval<short>
{
  static const short value = ((unsigned short) ~0) >> 1;
};

int
main ()
{
  std::cout << (int)maxval<signed char>::value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

同样适用于其他类型.

在确定最大值时需要区分有符号和无符号类型.简单的方法是枚举所有这些,如上例所示.

也许它可以通过组合enable_if和完成std::is_unsigned,但重新实现它们(没有标题!)仍然需要枚举所有类型.