什么是C中的陷阱表示(某些示例可能有帮助)?这适用于C++吗?
float f=3.5;
int *pi = (int*)&f;
Run Code Online (Sandbox Code Playgroud)sizeof(int) == sizeof(float)do f和*pi具有相同的二进制表示/模式?MSVC怎么样?我一直在研究在数组中查找孤独整数的算法,这里是实现:
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在这种情况下无法用数据类型表示.我的问题是:
XOR生成无法存储在int类型中的如此大的整数值?位运算符(~,&,|和^)在他们的推动数的按位表示操作.这样的操作会导致不确定的行为吗?
例如,~运算符在C标准中以这种方式定义:
6.5.3.3一元算术运算符
~运算符的结果是其(提升的)操作数的按位补码(也就是说,当且仅当未设置转换的操作数中的相应位时,才会设置结果中的每个位).整数提升在操作数上执行,结果具有提升类型.如果提升的类型是无符号类型,则表达式~E等效于该类型中可表示的最大值减去E.
在所有体系结构上,~0生成一个位模式,其符号位设置为1,所有值位设置为1.在一个补码架构上,该表示对应于负零.这个位模式可以成为陷阱表示吗?
是否存在涉及更常见架构的简单位运算符的未定义行为的其他示例?