无符号长长斐波那契数负数
Unsigned long long Fibonacci numbers negative?
本文关键字:无符号 更新时间:2023-10-16
我写了一个简单的斐波那契序列生成器,看起来像:
#include <iostream>
void print(int c, int r) {
std::cout << c << "tt" << r << std::endl;
}
int main() {
unsigned long long int a = 0, b = 1, c = 1;
for (int r = 1; r <= 1e3; r += 1) {
print(c, r);
a = b;
b = c;
c = a + b;
}
}
然而,当r
接近 40 的值时,奇怪的事情开始发生。 c
的值在负值和正值之间振荡,尽管他是一个unsigned
整数,当然斐波那契数列不可能完全是这样。
unsigned long long
整数是怎么回事?
即使对于long long
整数,c
也会变得太大吗?
您在这里有一个缩小的转换,print(c, r);
您定义print
只取int
,在这里您传递了一个unsigned long long
。它是实现定义的。
引用C++标准草案:
4.4.7:3:如果目标类型是有符号的,则值为 如果可以在目标类型中表示,则保持不变;否则 该值是实现定义的。
但通常的情况是:从unsigned long long
,只有刚好足以适应int
的位才会复制到你的函数中。截断的int
存储在二进制补码中,具体取决于最高有效位的值。你会得到这样的交替。
更改函数签名以捕获unsigned long long
void print(unsigned long long c, int r) {
std::cout << c << "tt" << r << std::endl;
}
顺便说一句,请参阅Mohit Jain对您的问题的评论。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 获取隐式转换溢出从无符号到已签名的警告
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- C4018:类内有符号、无符号不匹配
- C++无符号短裤的划分导致 int
- 库特无符号字符