相关疑难解决方法(0)


为什么无符号整数溢出定义了行为但是有符号整数溢出不是?

无符号整数溢出由C和C++标准很好地定义.例如,C99标准(§6.2.5/9)声明

涉及无符号操作数的计算永远不会过度流动,因为无法用结果无符号整数类型表示的结果将以比结果类型可以表示的最大值大1的数量为模.

但是,这两个标准都声明有符号整数溢出是未定义的行为.再次,从C99标准(§3.4.3/1)

未定义行为的一个示例是整数流上的行为

这种差异是否存在历史或(甚至更好!)技​​术原因?

c c++ integer-overflow undefined-behavior

197
推荐指数
4
解决办法
4万
查看次数

为什么带有GCC的x86上的整数溢出会导致无限循环?

以下代码进入GCC的无限循环:

#include <iostream>
using namespace std;

int main(){
    int i = 0x10000000;

    int c = 0;
    do{
        c++;
        i += i;
        cout << i << endl;
    }while (i > 0);

    cout << c << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以这是交易:有符号整数溢出在技术上是未定义的行为.但是x86上的GCC使用x86整数指令实现整数运算 - 它包含溢出.

因此,我本来期望它包装溢出 - 尽管事实上它是未定义的行为.但事实显然并非如此.那么我错过了什么?

我使用以下方法编译:

~/Desktop$ g++ main.cpp -O2
Run Code Online (Sandbox Code Playgroud)

GCC输出:

~/Desktop$ ./a.out
536870912
1073741824
-2147483648
0
0
0

... (infinite loop)
Run Code Online (Sandbox Code Playgroud)

禁用优化后,没有无限循环且输出正确.Visual Studio也正确编译它并给出以下结果:

正确的输出:

~/Desktop$ g++ main.cpp
~/Desktop$ ./a.out
536870912
1073741824
-2147483648
3
Run Code Online (Sandbox Code Playgroud)

以下是一些其他变体:

i *= 2;   //  Also …
Run Code Online (Sandbox Code Playgroud)

c c++ x86 gcc undefined-behavior

124
推荐指数
5
解决办法
1万
查看次数

C/C++无符号整数溢出

我正在读一篇关于整数安全性的文章.这是链接:http: //ptgmedia.pearsoncmg.com/images/0321335724/samplechapter/seacord_ch05.pdf

在页166中,有说:

涉及无符号操作数的计算永远不会溢出,因为无法由结果无符号整数类型表示的结果以模数减少为大于可由结果类型表示的最大值的数.

这是什么意思?感谢您的回复.

c c++

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

从没有中断引脚的传感器读取数据的最佳方法,该措施需要一段时间才能准备好

我正在尝试将压力传感器(MS5803-14BA)与我的电路板(NUCLEO-STM32L073RZ)连接。

根据数据表(第3页),压力传感器需要几毫秒的时间才能准备好读取测量值。对于我的项目,我对转换原始数据大约需要10 ms的最高分辨率感兴趣。

不幸的是,该压力传感器没有任何可用于查看测量准备就绪时间的中断引脚,因此,我暂时解决了在请求新数据后延迟的问题。

我不喜欢当前的解决方案,因为在这10毫秒内,我可以让单片机工作在其他地方(我的板上还连接了其他几个传感器),但是没有任何中断引脚,我不确定这是什么。解决此问题的最佳方法。

我想到了另一个解决方案:使用计时器,该计时器每20秒触发一次,并执行以下操作:

1.a Read the current value stored in the registers (discarding the first value)
1.b Ask for a new value
Run Code Online (Sandbox Code Playgroud)

这样,在下一次迭代中,我只需要读取上一次迭代结束时请求的值即可。

我不喜欢我的测量结果总是20毫秒。直到延迟保持20毫秒,它应该还是可以的,但是如果我需要降低速率,则解决方案的读数“老化”会增加。

您对如何处理还有其他想法吗?

谢谢。

注意:如果您需要查看我当前的实现,请告诉我。

c interrupt stm32 multitasking pressure

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