请解释以下段落.
"接下来的问题是我们是否可以在不损失精度的情况下为变量赋值.如果我们只是在加法或减法期间检查溢出是不够的,因为有人可能会添加1到-5并将结果分配给无符号int.然后实际的添加不会溢出,但结果仍然不适合."
当我加1到-5我没有任何理由担心.答案是应该是-4.那么结果不合适的问题是什么?你可以在这里找到我要去的完整文章:
在32位字中的-4的二进制表示如下(十六进制表示法)
0xfffffffc
Run Code Online (Sandbox Code Playgroud)
当解释为无符号整数时,此位模式表示数字2** 32-4或18446744073709551612.我不确定我会将此现象称为"溢出",但是将一个小的负整数分配给它是一个常见的错误.一个无符号类型的变量,并带有一个非常大的正整数.
这个技巧实际上被用于边界检查:如果你有一个有符号整数i并想知道它是否在0 <= i <n的范围内,你可以测试
if ((unsigned)i < n) { ... }
Run Code Online (Sandbox Code Playgroud)
它使用一个比较而不是两个来给你答案.演员到无人签名没有运行时成本; 它只是告诉编译器生成无符号比较而不是签名比较.