相关疑难解决方法(0)

在 C 中,为什么这个具有递增整数的“main”函数永远不会因溢出而崩溃?

main在C语言中,像stm32这样的嵌入式系统最基本的函数是:

int main(void) {
    int i = 0;

    while(1) {
        i++;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,由于i是一个整数,它不会溢出并因此在某些时候产生问题吗?

while(1) i++另外,在等待特定中断时使用相同的策略(使用 )循环是否安全?

编辑:感谢您的所有回答。我很遗憾不知道溢出处理程序与 C 和 C++ 有很大不同。现在我明白了 !

c embedded microcontroller stm32

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

C 整数溢出

我在 C 中处理整数,试图更多地探索溢出发生的时间和方式。

我注意到当我添加两个正数时,它们的总和溢出,我总是得到一个负数。

另一方面,如果我添加两个负数,它们的总和溢出,我总是得到一个正数(包括 0)。

我做了一些实验,但我想知道这是否适用于每种情况。

c integer overflow

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

有谁知道为什么gcc 4.8.4在无限循环中优化这段代码?

我发现在没有优化和-Os优化的情况下编译的以下代码的汇编程序结果之间的差异非常奇怪.

#include <stdio.h>

int main(){
    int i;

    for(i=3;i>2;i++);

    printf("%d\n",i);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

没有优化代码结果:

000000000040052d <main>:
  40052d:   55                      push   %rbp
  40052e:   48 89 e5                mov    %rsp,%rbp
  400531:   48 83 ec 10             sub    $0x10,%rsp
  400535:   c7 45 fc 03 00 00 00    movl   $0x3,-0x4(%rbp)
  40053c:   c7 45 fc 03 00 00 00    movl   $0x3,-0x4(%rbp)
  400543:   eb 04                   jmp    400549 <main+0x1c>
  400545:   83 45 fc 01             addl   $0x1,-0x4(%rbp)
  400549:   83 7d fc 02             cmpl   $0x2,-0x4(%rbp)
  40054d:   7f f6                   jg     400545 <main+0x18> …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc

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

`short`和C++中的`int`是一样的吗?

我看过一些short在C#中使用的答案,但我不确定他们是否真的回答了我的问题.是short在C++中另一个名字int?我知道你可以制作short int,这似乎能够处理很多价值但我还在开始,所以很明显,如果这short不是很多价值观.但是在这里的代码片段中:

short lives,aliensKilled;
Run Code Online (Sandbox Code Playgroud)

它不使用int short,它只是使用short.所以我想我的问题是,如果我不低于-32,768或超过32,767 ,我可以用它short作为替代品int吗?

另外,只要更换适当的东西,它是否可以替换shortint,并且它不会真正搞乱任何东西?(顺便说一下lives,aliensKilled它们都是变量名.)

c++ int short

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

指针变量只是与某些运算符整数还是"符号"?

编辑:原始的单词选择令人困惑.术语"象征性"比原始术语("神秘")要好得多.

在关于我以前的C++问题的讨论中,我被告知指针是

这并没有健全的权利!如果没有任何符号,并且指针是其表示,那么我可以执行以下操作.我可以吗?

#include <stdio.h>
#include <string.h>

int main() {
    int a[1] = { 0 }, *pa1 = &a[0] + 1, b = 1, *pb = &b;
    if (memcmp (&pa1, &pb, sizeof pa1) == 0) {
        printf ("pa1 == pb\n");
        *pa1 = 2;
    }
    else {
        printf ("pa1 != pb\n");
        pa1 = &a[0]; // ensure well defined behaviour in printf
    }
    printf ("b = %d *pa1 = %d\n", …
Run Code Online (Sandbox Code Playgroud)

c++ pointers undefined-behavior language-lawyer

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