相关疑难解决方法(0)

a&b的结果是什么?

这很尴尬,但按位AND运算符在C++标准中定义如下(强调我的).

执行通常的算术转换; 结果是其操作数的按位AND功能.运算符仅适用于整数或无范围的枚举操作数.

这看起来对我来说毫无意义.据我所知,"按位AND函数"在标准中的任何地方都没有定义.

我知道AND功能已被充分理解,因此可能不需要解释."按位"一词的含义也应该相当清楚:该函数应用于其操作数的相应位.但是,操作数的位构成不清楚.

是什么赋予了?

c++ bitwise-operators language-lawyer

39
推荐指数
3
解决办法
6618
查看次数

UINT_MAX的所有位都设置为1吗?

这个问题之前被问过,但我仍然感到困惑.

我知道

unsigned int a = -1;
Run Code Online (Sandbox Code Playgroud)

会的UINT_MAX.但这并不是因为-1的所有位都已设置.C11说

如果新类型是无符号的,则通过重复加或减一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内为止

所以假设UINT_MAX是100(我知道它应该大于2 ^ 16-1但现在让我们忽略它)

unsigned int a = -1; // will be
unsigned int a = -1 + UINT_MAX + 1; // 100 = UINT_MAX  
Run Code Online (Sandbox Code Playgroud)

标准只说UINT_MAX >= 2^16-1.但它是否应该说它应该是2 ^ n-1?

在C++中答案也不同?

c c++ language-lawyer

32
推荐指数
2
解决办法
3625
查看次数

C++中的整数可以是NaN吗?

我可以设置intNaN?如果是的话,那我怎么才能检查一个intNaN或不是?

c++ nan

27
推荐指数
2
解决办法
2万
查看次数

C和C++标准对位级整数表示和操作有何看法?

我知道C和C++标准没有规定数字的特定表示(可以是二进制补码,符号和数量等).但我不清楚这些标准(并且无法确定是否已经说明)知道在使用位时是否存在任何特定的限制/保证/保留表示.尤其:

  1. 如果整数类型中的所有位都为零,那么整数整数是否代表零?
  2. 如果整数类型中的任何位是1,那么整数整数是否表示非零?(如果这是"是",那么一些表示如符号和幅度将受到额外限制)
  3. 是否有保证的方法来检查是否有任何位未设置?
  4. 是否有保证的方法来检查是否设置了任何位?(#3和#4类型取决于#1和#2,因为我知道如何设置,例如某个变量中的第5位(参见#5)x,我想检查变量y以查看它是否是第5位是1,我想知道是否if (x & y)可行(因为据我所知,这取决于表示的值而不是该位是否实际上是1或0))
  5. 是否有保证的方法来设置最左边和/或最右边的位?(至少比将char c所有位置为真(设置为c = c | ~c)并c = c << (CHAR_BIT - 1)设置高位和c = c ^ (c << 1)低位更简单的方法,假设我没有做任何假设,我不应该这样,给出这些问题)
  6. 如果#1的答案是"否",那么如何迭代整数类型的位并检查每个位是1还是0?

我想我的整体问题是:C和C++标准是否有关于位和整数的限制/保证/保留表示,尽管事实上没有强制表示整数的表示(如果C和C++标准在这方面有所不同) ,他们的区别是什么?)

我在完成作业时提出了这些问题,这需要我做一些操作(注意这些不是我作业的问题,这些都是"抽象的").

编辑:至于我称之为"位",我的意思是"值形成"位而不包括"填充"位.

c c++ integer data-representation language-lawyer

18
推荐指数
2
解决办法
3978
查看次数

C问题:无符号整数和按位运算中的填充位(C89)

我有很多代码对无符号整数执行按位运算.我编写了我的代码,假设这些操作是在固定宽度的整数上,没有任何填充位.例如,32位无符号整数的数组,其中所有32位可用于每个整数.

我希望让我的代码更具可移植性,并且我专注于确保我符合C89(在这种情况下).我遇到的一个问题是填充整数.拿这个极端的例子,取自GMP手册:

然而,在Cray矢量系统上,可以注意到short和int总是以8个字节存储(并且sizeof指示),但仅使用32或46位.指甲功能可以通过传递例如8*sizeof(int)-INT_BIT来解决这个问题.

我也在其他地方读过这种类型的填充.我昨晚实际上在SO上读了一篇文章(请原谅我,我没有链接,我将引用类似记忆的内容),如果你有一个带有60个可用位的双,另外4个可以用于填充和那些填充位可以用于某些内部目的,因此它们不能被修改.


因此,假设我的代码是在一个平台上编译的,其中unsigned int类型的大小为4个字节,每个字节为8位,但最重要的2位是填充位.在这种情况下UINT_MAX会是0x3FFFFFFF(1073741823)吗?

#include <stdio.h>
#include <stdlib.h>

/* padding bits represented by underscores */
int main( int argc, char **argv )
{
    unsigned int a = 0x2AAAAAAA; /* __101010101010101010101010101010 */
    unsigned int b = 0x15555555; /* __010101010101010101010101010101 */
    unsigned int c = a ^ b; /* ?? __111111111111111111111111111111 */
    unsigned int d = c << 5; /* ??  __111111111111111111111111100000 */
    unsigned int e = d >> 5; /* ?? __000001111111111111111111111111 */

    printf( "a: …
Run Code Online (Sandbox Code Playgroud)

c bit-manipulation padding bitwise-operators

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