首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用sizeof获得2的最大幂

使用sizeof获得2的最大幂
EN

Stack Overflow用户
提问于 2012-10-20 19:13:03
回答 4查看 559关注 0票数 1

在C/C++中,有没有一种方法可以使用sizeof运算符来计算由特定数据类型表示的2的最大幂?

例如,假设我有一个unsigned short int。它的值可以在065535之间。因此,一个unsigned short int可以包含的2的最大幂是32768

我将这个unsigned short int传递给一个函数,(目前)我有如下所示的算法:

代码语言:javascript
运行
复制
if (ushortParam > 32768) {
    ushortParam = 32768; // Bad hardcoded literals
}

但是,在将来,我可能想要更改变量类型,以包含更大的2次方。是否有一个使用sizeof()的与类型无关的公式可以实现以下功能:

代码语言:javascript
运行
复制
if (param > /*Some function...*/sizeof(param) )
{
    param = /*Some function...*/sizeof(param);
}

注意:该参数永远不会只需要浮点精度整数。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-20 19:17:07

设置参数大小的a变量的最高有效位将得到2的最高幂。

代码语言:javascript
运行
复制
1 << (8*sizeof(param)-1)
票数 4
EN

Stack Overflow用户

发布于 2012-10-20 19:17:52

下面是什么:

代码语言:javascript
运行
复制
const T max_power_of_two = (std::numeric_limits<T>::max() >> 1) + 1;
票数 3
EN

Stack Overflow用户

发布于 2012-10-20 21:01:22

要获得由某个整数类型表示的2的最高幂,您可以使用limits.h而不是sizeof运算符。例如:

代码语言:javascript
运行
复制
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>

int main() {

  int max   = INT_MAX;
  int hmax  = max>>1;
  int mpow2 = max ^ hmax;

  printf("The maximum representable integer is %d\n",max);
  printf("The maximum representable power of 2 is %d\n",mpow2);
  return 0;
}

这应该总是有效的,因为总是定义正整数的右移位。引用标准C部分6.5.7.5 (按位移位运算符):

E1 >> E2的结果是E1 right-shifted E2 bit position。如果E1具有无符号类型,或者如果E1具有有符号类型和非负值,则结果的值是E1的商除以2的幂E2的数量的整数部分。

如果强制使用sizeof,您可以使用:

代码语言:javascript
运行
复制
1 << (CHAR_BIT*sizeof(param)-1)

对于无符号整数类型和:

代码语言:javascript
运行
复制
1 << (CHAR_BIT*sizeof(param)-2)

用于有符号整数类型。以上各行仅在没有填充位的整数类型的情况下有效。标准C中确保这些行正常工作的部分在6.2.6.2节中。特别是:

对于unsigned char以外的无符号整数类型,对象表示的位应分为两组:值位和填充位(不需要有任何后者)。如果有N个值位,则每个位应表示1和2N-1之间的2的不同幂,以便该类型的对象应能够使用纯二进制表示来表示从0到2N -1的值;这应称为值表示。

保证第一个方法在以下情况下工作:

对于带符号整数类型,对象表示的位应分为三组:值位、填充位和符号位。不需要任何填充位;应该只有一个符号位。

..。

符号位为零的有符号整数类型的有效(非陷阱)对象表示是相应无符号类型的有效对象表示,并且应表示相同的值。

解释了为什么第二行给出了正确的答案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12987834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档