C算术溢出32位和64位之间的区别?

标签 c math 64-bit overflow 32-bit

我想知道32位和64位检查算术溢出是否有什么区别? (除了限制..)

例如 32 位乘法 a * b:

if(b > 0 && a > UINT32_MAX_VALUE / b) {
//Overflow
} 

我可以使用相同的逻辑进行 64 位乘法吗? 像:

if(b > 0 && a > UINT64_MAX_VALUE / b) {
//Overflow
} 

当我必须用有符号/无符号检查 64 位溢出时,是否有任何陷阱?

最佳答案

自己简化一下。什么是 32 位 int 与 64 位 int?我们知道 int 就是一个 int,它可以包含相同的内容并遵循相同的规则,但有更多的位。

考虑一下 charshort(在 32 位系统上)。

unsigned char cmax  = 0xFF;   // 1111 1111(2) = 255(10)

unsigned short imax = 0xFFFF; // 1111 1111 1111 1111(2) = 65535(10)

如果我向其中任何一个添加 1,它们就会溢出,其中一个的大小是另一个的两倍。我是否需要做一些特殊的事情来检查一种情况与另一种情况下的溢出情况?没有。

您的示例有所不同,因为它当然是两个 int,但推理是相同的。

关于C算术溢出32位和64位之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13251337/

相关文章:

c循环函数计算时间复杂度

c - 警告 : format ‘%llx’ expects argument of type ‘long long unsigned int *’ , 但参数 3 的类型为 ‘off64_t *’ [-Wformat]

.net - 如何使用.NET判断我是在x64还是x86上?

c - 屏幕保护程序依赖于文件 C

c - C 中的结构体被用零填充

javascript - 一段代码看不懂

java - 签署的 3 点之间的角度,糟糕的结果

WiX 安装程序始终安装到 x86 和 x64 上的 "Program Files"目录

c - 使用系统调用时的 Printf()

math - 根据索引查找 X 和 Y