- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我写了一个测试下溢和上溢的小实验,使用 c 和一台 64 位机器。对于 int 类型,最小/最大值为:
int tmax = 2147483647;
int tmin = -2147483648;
我知道补码是如何工作的,这不是我的问题。
所以我想,如果我做一些负 tmin 会发生什么?即:
int tmin = -2147483648;
int negativeTmin = -tmin;
它最终还是 tmin。 (也就是说,negativeTmin 将为 -2147483648)
我的问题是为什么会这样?既然正数 2,147,483,648 不能用 int 表示,我当然理解为什么不是这样,但奇怪的是它根本没有改变使它成为唯一在应用 - 时不会改变的非零整数。我并不是说我对它应该是什么有了更好的了解,我只是好奇为什么 -tmin == tmin。它是否与按位运算有关,或者减法在计算机中是如何完成的,或者它默认这样做是因为我试图做的事情是未定义的,还是其他原因?
我的代码:
#include <stdio.h>
int main() {
int tmax = 2147483647;
printf("tmax Before: %d\n", tmax);
tmax++;
printf("tmax After: %d\n\n", tmax);
int tmin = -2147483648;
printf("tmin Before: %d\n", tmin);
tmin--;
printf("tmin After: %d\n\n", tmin);
int tmin2 = -2147483648;
int negativeTmin = -tmin2;
printf("negative tmin: %d\n\n", negativeTmin);
return 0;
}
输出:
tmax Before: 2147483647 tmax After: -2147483648
tmin Before: -2147483648 tmin After: 2147483647
negative tmin: -2147483648
最佳答案
正如其他人在此处发布的那样,从技术上讲,您正在做的事情会导致未定义的行为,因为 C 中有符号整数的上溢或下溢会导致未定义的行为。
另一方面,在大多数 Intel 系统上,整数上溢或下溢只是环绕整数值并设置一些处理器标志,以便以后的指令可以检测到溢出。在这些系统上,有理由问 - 为什么 在计算 -Tmin 时得到 Tmin?
在带符号的二进制补码系统中,需要注意表达式 -x
相当于~x + 1
.假设您有 Tmin,如下所示:
10000000 00000000 00000000 00000000
如果你计算 ~Tmin,你会得到
01111111 11111111 11111111 11111111
这恰好是 Tmax。如果你加一个,你会得到一个巨大的纹波进位,一直传播到最后,屈服
10000000 00000000 00000000 00000000
这就是我们的出发点。这就是为什么您可能会看到 Tmin 回来的原因。
另一种理解方式:您知道有符号 32 位整数的 Tmin 是 -231。 -Tmin 的值应满足 Tmin + -Tmin = 0 (mod 232 )。那么 [-231, 231 - 1] 范围内的哪个值恰好具有此属性?它是 -231,这就是为什么 Tmin = -Tmin。
因此,您问题的最佳答案可能是“从技术上讲,您正在做的是未定义的行为,但在合理的英特尔系统和未设置为进行积极优化的编译器上,它归结为如何带符号的 32 位整数算法的工作原理以及如何定义否定。”
关于c - 为什么最小可能整数的否定会产生自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45089640/
这个问题在这里已经有了答案: Tempered Greedy Token - What is different about placing the dot before the negative l
我想做与THIS相反的事情。换句话说,我该怎么做: SELECT * FROM table1 WHERE col1, col2 NOT IN (SELECT col1, col2
嗨,假设我有这个字符串: var text = "Jackie Chan | Jack Frost | Capt.Jack Sparrow" 我想找到除 Jack Frost 之外的所有 /Jack/
我只想在运行低于 iOS8 操作系统的设备上执行代码块。我做不到: if #available(iOS 8.0, *) == false { doFoo() } 我目前使用的解决方案是: if
我使用 htaccess 来解析对 seo 友好的请求。早些时候我的 htaccess 有这些字符串来解析像 /some/request/ 这样的请求 RewriteCond %{REQUEST_UR
我只想在运行低于 iOS8 操作系统的设备上执行代码块。我做不到: if #available(iOS 8.0, *) == false { doFoo() } 我目前使用的解决方案是: if
我的一个考试题目是: ! ( ! ( a != b) && ( b > 7 ) ) 选择: a) (a != b) || (b 7) 最初,我以为是 D。这是不正确的,我知道为什么。我不明白逻辑
我很难在 Prolog 中寻找关于否定的明确答案,所以如果这是一个明显的问题,我深表歉意: 我正在尝试编写一个简单的代码,从逻辑上说“如果 X 喜欢 Y 并且只喜欢 Y,则 X 和 Y 彼此相爱。”我
假设我有以下字符串: 邮寄至 电话:+358123456 http://www.google.fi 邮箱:foo@bar.fi Hello World 电话 大象 一分钱 链接 猫头鹰 如何在 RE2
如何在 RE2 中为“匹配字符串不以 4 或 5 开头”编写正则表达式? 在 PCRE 中,我会使用 ^(?!4)但 RE2 doesn't support that syntax . 最佳答案 您可
假设我有一个谓词 is_foo?/1在 Elixir 我想在一个将谓词作为参数的函数中使用它,但被否定了。 Elixir 有没有办法简单地做到这一点? 最佳答案 &(!is_foo? &1)应该这样做
假设我想制作一个描述所有整数的 RE。根据定义,表达式为: (+|-)?[0-9]+ 但定义也匹配这些数字:+0, -0, 0045 0045 情况可能可以使用回溯表达式来解决,但是我如何才能从关于。
作为 Javascript 的初学者,我有一个看起来有点奇怪的问题。我正在使用我在网上找到的外部库,我在其中找到了以下代码: if('useHoles' in c){ this.config.u
否定 MySQL 查询的最佳方法是什么,也就是说,无论条件如何,强制它不返回任何记录。 我使用了 AND 1=0 ,它似乎有效,但我有兴趣知道是否有这样的标准。 最佳答案 只需添加一个false条件
我有一个问题:我必须获取所有未在指定时间表中安排的司机姓名。我可以使用以下查询获取指定时间表中安排的所有司机姓名,但我无法否定它。请给我指示如何去做。谢谢。 select drivername fro
我正在做功能测试,刚刚发现了 assert_difference,如: assert_difference('Account.count') do post :create, :account =
考虑这个模式:*.py。它匹配所有以 py 扩展名结尾的路径。现在,是否有可能找到一个匹配其他一切的模式? 我认为这样可以做到:*[!.][!p][!y],但显然 fnmatch.fnmatch总是返
我有以下正则表达式模式:[^\u0001-\u00FF]。这样我就可以验证用户输入不包含“€”等无效字符。 var utfRegex: RegExp = new RegExp('[^\u0001-\u
我尝试使用 vector::erase 和 std::remove_if 从 vector 中删除对象。我有一个外部 namespace 来进行选择: template bool Namespace:
是否有可能/可以实现否定 boost 过滤适配器,例如 std::vector v = {1, 2, 3, 4, 5}; for(auto i : v | !filtered(is_even))
我是一名优秀的程序员,十分优秀!