在 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中有以下代码:
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转换为十进制的等值?
在调试我的代码时,我注意到发生了一些奇怪的事情,所以我添加了更多行并且更加困惑:
#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++ 新手,想测试我在 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,但它并没有结束,甚至还没有在那里。有人可以向我解释发生了什么事吗?
请考虑以下代码:
#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结尾.任何解释?
所以当我输入以下命令时
#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?
我只是写这段代码,但我不知道它是如何工作的。
为什么价值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)
它显示了整数的范围
我有一个非常简单的程序:
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)?