相关疑难解决方法(0)

int16_t如何表示大于32767且不翻转的数字

在 Arduino Uno 上运行的这段代码会打印递增的数字,并按预期从 32767 回绕到 -32768。

int16_t i = 0;

void setup() {
  Serial.begin(115200);
}

void loop() {
  i++;
  Serial.println(i);
}
Run Code Online (Sandbox Code Playgroud)

然而,人们认为在功能上等效的这段代码不断打印超过 200000 个 16 位数字(有符号或无符号)应该能够表示的数字。

void setup() {
  Serial.begin(115200);

  int16_t i = 0;

  while(true) {
    i++;
    Serial.println(i);
  }
}

void loop() {}
Run Code Online (Sandbox Code Playgroud)

Arduino 参考中有关于数据类型的注释/警告int。这有关系吗?

当有符号变量超过其最大或最小容量时,它们就会溢出。溢出的结果是不可预测的,因此应该避免这种情况。溢出的典型症状是变量从最大容量“滚动”到最小容量,反之亦然,但情况并非总是如此。如果您想要这种行为,请使用 unsigned int。

第二个代码片段发生了什么?变量如何明显代表这么大的数字而不滚动?

c++ types arduino

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

c解释中的按位运算

我在c中有以下代码:

 unsigned int a = 60; /* 60 = 0011 1100 */
 int c = 0;
 c = ~a; /*-61 = 1100 0011 */
 printf("c = ~a = %d\n", c );
 c = a << 2; /* 240 = 1111 0000 */
 printf("c = a << 2 = %d\n", c );
Run Code Online (Sandbox Code Playgroud)

第一个输出是-61而第二个输出是240.为什么第一个printf会计算1100的两个补码,而第二个只是将1111 0000转换为十进制的等值?

c bit-manipulation

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

C++ bool 获得随机/错误值?

在调试我的代码时,我注意到发生了一些奇怪的事情,所以我添加了更多行并且更加困惑:

#include <iostream>
#include <memory>

struct Node
{
    size_t size = 0;
};

class MallocMetadata {
public:
    size_t size; /** Effective allocation - requested size **/
    bool is_free;
    MallocMetadata *next;
    MallocMetadata *prev;
    MallocMetadata *next_free;
    MallocMetadata *prev_free;
};

int main()
{
    size_t size = 0;
    auto node = std::make_shared<Node>();
    int tmp_res=node->size - size - sizeof(MallocMetadata);
    bool test=(node->size - size - sizeof(MallocMetadata)) < 128;
    bool test1=tmp_res<128;
    std::cout << tmp_res << "\n";
    std::cout << test << "\n";
    std::cout << test1 << "\n";
} …
Run Code Online (Sandbox Code Playgroud)

c++ debugging boolean

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

C++ 新手,创建了一些输出看似无限数字的东西。有人可以解释为什么吗?

我是 C++ 新手,想测试我在 while 循环中的知识,我使用 MS Visual Studios 2019,并创建了此代码

int main() {
    int i = 12;
    while (i > 10) {
        cout << i;
        i++;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我运行这个程序时,我遇到了看似无限的数字线,它们仍在继续运行。我尝试在 w3schools IDE 上使用它,它打印出一个长字符串。我知道整数最大可达 2,147,483,647,但它并没有结束,甚至还没有在那里。有人可以向我解释发生了什么事吗?

c++ while-loop

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

为什么对于有符号整数,i*= 2似乎收敛为0?

请考虑以下代码:

#include <iostream>
int main(int argc, char* argv[])
{
    int i = /* something */;
    for (std::size_t n = 0; n < 100; ++n) {
        i *= 2;
        std::cout << i << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

对有符号整数进行溢出是未定义的行为.但是,我不明白为什么这段代码似乎总是以0结尾.任何解释?

c++ integer integer-overflow

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

C++中的十六进制与十进制

所以当我输入以下命令时

#include <stdio.h>
int main() {
  int myInt;
  myInt = 0xFFFFFFE2;
  printf("%d\n",myInt);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是-30.

我得到了两个补码的想法但是当我直接输入-30时我也得到了相同的数字.所以我的问题是为什么我会以十六进制形式写出我的号码?如果我使用十六进制形式,编译器如何区分我的意思是0xFFFFFFE2是-30的二进制补码还是值4294967266?

c++ hex overflow

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

正值递增时整数如何以负数结尾?

我只是写这段代码,但我不知道它是如何工作的。

为什么价值k会是负数?怎么样?

#include<iostream>
using namespace std;
int main()
{
    int k=1,j=0;
    while(k>j)
    {
        j=k;
        k++;
    }
    cout<<j<<"\n"<<k;
}
Run Code Online (Sandbox Code Playgroud)

它显示了整数的范围

c++

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

为什么我可以将65535 + 1转换为C++中的有效int?

我有一个非常简单的程序:

int main()
{
  char* num = new char[5];
  sprintf(num, "65536");
  std::cout << "atoi(num): " << atoi(num) << "\n";
}
Run Code Online (Sandbox Code Playgroud)

无符号INT的最大大小为65535.为什么运行时该程序不会溢出atoi(65536)

c++ integer overflow

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