相关疑难解决方法(0)

使用-1将所有位设置为true是否安全?

我已经看到这种模式在C&C++中使用了很多.

unsigned int flags = -1;  // all bits are true
Run Code Online (Sandbox Code Playgroud)

这是一个很好的便携式方法吗?或正在使用0xffffffff~0更好?

c c++ binary bit-fields

130
推荐指数
9
解决办法
3万
查看次数

有没有办法在编译时计算整数类型的宽度?

char字节为单位的整数类型(或任何类型)的大小很容易计算为sizeof(type).一个常见的习惯用法是乘以CHAR_BIT找到该类型占用的位数,但是在使用填充位的实现中,这将不等于值位的宽度.更糟糕的是,代码如下:

x>>CHAR_BIT*sizeof(type)-1
Run Code Online (Sandbox Code Playgroud)

如果CHAR_BIT*sizeof(type)大于实际宽度,实际上可能有未定义的行为type.

为简单起见,我们假设我们的类型是无符号的.那么宽度typeceil(log2((type)-1).有没有办法将此值计算为常量表达式?

c integer padding width

14
推荐指数
2
解决办法
2893
查看次数

在GNU C中获取/设置整数最高位的最便携方式是什么

在GNU C中获取/设置整数最高位的最便携方法是什么?

这是彭博采访问题.那个时候我没有给出最好的答案.有人可以回答吗?

谢谢

c bitwise-operators

8
推荐指数
2
解决办法
2219
查看次数

以编程方式确定有符号整数类型的最大值

此相关问题是关于在编译时确定签名类型的最大值:

C问题:off_t(和其他有符号整数类型)的最小值和最大值

但是,我已经意识到在运行时确定有符号类型(例如time_toff_t)的最大值似乎是一项非常困难的任务.

我能想到的最接近解决方案的是:

uintmax_t x = (uintmax_t)1<<CHAR_BIT*sizeof(type)-2;
while ((type)x<=0) x>>=1;
Run Code Online (Sandbox Code Playgroud)

只要type没有填充位,这就避免了任何循环,但是如果type确实有填充位,则强制转换会调用实​​现定义的行为,这可能是信号或无意义的实现定义转换(例如,剥离符号位).

在我看来,我开始认为问题是无法解决的,这有点令人不安,并且会成为C标准的缺陷.证明我错的任何想法?

c signed overflow

8
推荐指数
1
解决办法
5156
查看次数

通过位操作获取INT_MAX

如何INT_MAX在C中获得仅使用按位运算符的值?我希望~01111111111(补码1,所以十进制-1)并且~0 >> 10111111111,这将是最大值,但它仍然是-1.

为什么这样,我如何INT_MAX通过使用位操作获得值?

c bitwise-operators

6
推荐指数
1
解决办法
5073
查看次数

标签 统计

c ×5

bitwise-operators ×2

binary ×1

bit-fields ×1

c++ ×1

integer ×1

overflow ×1

padding ×1

signed ×1

width ×1