相关疑难解决方法(0)

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

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
查看次数

在C中设置最重要的位

我试图在长的无符号x中设置最重要的位.要做到这一点,我使用这行代码:

x |= 1<<((sizeof(x)*8)-1);
Run Code Online (Sandbox Code Playgroud)

我认为这应该工作,因为sizeof以字节为单位给出大小,所以我乘以8并减去1来设置最后一位.每当我这样做时,编译器都会出现此警告:"警告:左移计数> =类型的宽度"

我不明白为什么会出现这种错误.

c bit-manipulation

12
推荐指数
2
解决办法
7254
查看次数

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

我偶尔会遇到一个整数类型(例如POSIX有符号整数类型off_t),其中有一个宏的最小值和最大值是有帮助的,但我不知道如何制作一个真正可移植的宏.


对于无符号整数类型,我一直认为这很简单.0最小和~0最大.我已经阅读了几个不同的SO线程,建议使用-1而不是~0为了便携性.这里有一个有争议的有趣线程:
c ++ - 使用-1将所有位设置为true是否安全?- 堆栈溢出

然而,即使在阅读了这个问题后,我仍然感到困惑.另外,我正在寻找兼容C89和C99的东西,所以我不知道是否适用相同的方法.说我有一种类型uint_whatever_t.难道我不能先转为0然后按位补码?这样可以吗?:

#define UINT_WHATEVER_T_MAX ( ~ (uint_whatever_t) 0 )
Run Code Online (Sandbox Code Playgroud)


有符号整数类型看起来像是一个更难以破解的坚果.我已经看到了几种不同的可能解决方案,但只有一种似乎是可移植的.无论是那个还是不正确的.我在谷歌搜索OFF_T_MAX和OFF_T_MIN时找到了它.感谢Christian Biere:

#define MAX_INT_VAL_STEP(t) \
    ((t) 1 << (CHAR_BIT * sizeof(t) - 1 - ((t) -1 < 1))) 

#define MAX_INT_VAL(t) \
    ((MAX_INT_VAL_STEP(t) - 1) + MAX_INT_VAL_STEP(t))

#define MIN_INT_VAL(t) \
    ((t) -MAX_INT_VAL(t) - 1)

[...]
#define OFF_T_MAX MAX_INT_VAL(off_t) 
Run Code Online (Sandbox Code Playgroud)


我找不到关于C89中不同允许类型的有符号整数表示的任何内容,但C99在§J.3.5中有关于整数可移植性问题的注释:

是否使用符号和幅度,二进制补码或一对补码表示有符号整数类型,以及非常值是陷阱表示还是普通值(6.2.6.2).

这似乎意味着只能使用那三个列出的签名数字表示.暗示是否正确,并且上面的宏是否与所有三种表示兼容?


其他想法:如果有填充位
,似乎类似函数的宏MAX_INT_VAL_STEP()会给出不正确的结果.我想知道是否有任何办法解决这个问题.

通过维基百科上的带符号数字表示,我发现对于所有三个有符号整数表示,任何有符号整数类型的MAX都将是:
符号位关闭,所有值位开启(全部三个)
并且其MIN将是:
符号位开启,全部值符号打开(符号和幅度)
符号位打开,所有值位关闭(1 …

c binary bit-manipulation bitwise-operators

11
推荐指数
3
解决办法
4763
查看次数

如何获取按位而不是数字但不否定符号位?

我有一个代表掩码的数字,我想获得负面具(0110,即6).我想按位做但不是它似乎也否定了符号位,我得到了一个不需要的值...

size_t msk = 9; // that is 1001, or 000...01001 on more bits
size_t nMsk = ~msk; // this I want to be 6, that is 0110, but bitwise not  
                    // is negating all the bits, so I get 111...10110
Run Code Online (Sandbox Code Playgroud)

有没有快速的方法(没有循环)?

编辑 更多信息:

我在其中一个答案的一些评论中添加了一些更好的案例:在我的情况下,16是100000000而~16不是111011111111,而是000011111111

c c++

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

标签 统计

c ×4

bit-manipulation ×2

binary ×1

bitwise-operators ×1

c++ ×1

integer ×1

padding ×1

width ×1