在C/C++中,有没有一种方法可以使用sizeof运算符来计算由特定数据类型表示的2的最大幂?
例如,假设我有一个unsigned short int。它的值可以在0和65535之间。因此,一个unsigned short int可以包含的2的最大幂是32768。
我将这个unsigned short int传递给一个函数,(目前)我有如下所示的算法:
if (ushortParam > 32768) {
ushortParam = 32768; // Bad hardcoded literals
}但是,在将来,我可能想要更改变量类型,以包含更大的2次方。是否有一个使用sizeof()的与类型无关的公式可以实现以下功能:
if (param > /*Some function...*/sizeof(param) )
{
param = /*Some function...*/sizeof(param);
}注意:该参数永远不会只需要浮点精度整数。
发布于 2012-10-20 19:17:07
设置参数大小的a变量的最高有效位将得到2的最高幂。
1 << (8*sizeof(param)-1)发布于 2012-10-20 19:17:52
下面是什么:
const T max_power_of_two = (std::numeric_limits<T>::max() >> 1) + 1;发布于 2012-10-20 21:01:22
要获得由某个整数类型表示的2的最高幂,您可以使用limits.h而不是sizeof运算符。例如:
#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,您可以使用:
1 << (CHAR_BIT*sizeof(param)-1)对于无符号整数类型和:
1 << (CHAR_BIT*sizeof(param)-2)用于有符号整数类型。以上各行仅在没有填充位的整数类型的情况下有效。标准C中确保这些行正常工作的部分在6.2.6.2节中。特别是:
对于unsigned char以外的无符号整数类型,对象表示的位应分为两组:值位和填充位(不需要有任何后者)。如果有N个值位,则每个位应表示1和2N-1之间的2的不同幂,以便该类型的对象应能够使用纯二进制表示来表示从0到2N -1的值;这应称为值表示。
保证第一个方法在以下情况下工作:
对于带符号整数类型,对象表示的位应分为三组:值位、填充位和符号位。不需要任何填充位;应该只有一个符号位。
..。
符号位为零的有符号整数类型的有效(非陷阱)对象表示是相应无符号类型的有效对象表示,并且应表示相同的值。
解释了为什么第二行给出了正确的答案。
https://stackoverflow.com/questions/12987834
复制相似问题