相关疑难解决方法(0)

陷阱表示

  1. 什么是C中的陷阱表示(某些示例可能有帮助)?这适用于C++吗?

    float f=3.5;
    int *pi = (int*)&f;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编辑:我知道'pi'违反了别名规则,根据C标准它是UB.至少在海湾合作委员会它没有产生任何错误,但警告.在这个实现(即GCC)中,假设sizeof(int) == sizeof(float)do f*pi具有相同的二进制表示/模式?MSVC怎么样?

c c++ gcc visual-studio-2010

63
推荐指数
3
解决办法
1万
查看次数

两个整数的XOR可以超出界限吗?

我一直在研究在数组中查找孤独整数的算法,这里是实现:

int arr[] = {10, 20, 30, 5, 20, 10, 30};
int LonelyInteger = 0;
for(int i=0; i< 7; i++)
{
    LonelyInteger = LonelyInteger ^ arr[i];
}
Run Code Online (Sandbox Code Playgroud)

结果是5.

我的问题是 - 据说整数(由XOR操作产生)由于这个操作太大了:

LonelyInteger ^ arr[i]
Run Code Online (Sandbox Code Playgroud)

这导致一个潜在的大整数,int在这种情况下无法用数据类型表示.我的问题是:

  1. 是否有可能XOR生成无法存储在int类型中的如此大的整数值?
  2. 如果不可能发生这种情况,那么有证据吗?

c c++ bit-manipulation integer-overflow bitwise-xor

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

当sizeof(int)== 4时,1 << 31在C中定义得很好

根据这个问题的答案:

E1 << E2的结果是E1左移E2位位置; 腾出的位用零填充.如果E1具有无符号类型,则结果的值为E1×2 E2,比结果类型中可表示的最大值减少一个模数.如果E1具有带符号类型和非负值,并且E1×2 E2可在结果类型中表示,那么这就是结果值; 否则,行为未定.

这似乎意味着1 << 31未定义.

但是,如果我使用,GCC不会发出警告1 << 31.它确实发出一个问题1 << 32. 链接

那是哪个呢?我误解了标准吗?海湾合作委员会有自己的解释吗?

c bit-shift undefined-behavior language-lawyer

25
推荐指数
3
解决办法
1924
查看次数

按位运算符可以有未定义的行为吗?

位运算符(~,&,|^)在他们的推动数的按位表示操作.这样的操作会导致不确定的行为吗?

例如,~运算符在C标准中以这种方式定义:

6.5.3.3一元算术运算符

~运算符的结果是其(提升的)操作数的按位补码(也就是说,当且仅当未设置转换的操作数中的相应位时,才会设置结果中的每个位).整数提升在操作数上执行,结果具有提升类型.如果提升的类型是无符号类型,则表达式~E等效于该类型中可表示的最大值减去E.

在所有体系结构上,~0生成一个位模式,其符号位设置为1,所有值位设置为1.在一个补码架构上,该表示对应于负零.这个位模式可以成为陷阱表示吗?

是否存在涉及更常见架构的简单位运算符的未定义行为的其他示例?

c c++ bitwise-operators language-lawyer ones-complement

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