



























这是一个创建于 786 天前的主题,其中的信息可能已经有所发展或是发生改变。
unsigned int x1 = 0xaeb1c2aa;
unsigned int x2 = 0xaeb1c2aa;
long long r_whole = (signed long long)x1 * (signed long long)x2;
printf("r_whole = %lld\n",r_whole);
输出的结果是无符号乘法的结果:
r_whole = 8590088583138384100
而下面的程序
unsigned int x1 = 0xaeb1c2aa;
unsigned int x2 = 0xaeb1c2aa;
int xx1 = x1;
int xx2 = x2;
long long r_whole = (signed long long)xx1 * (signed long long)xx2;
printf("r_whole = %lld\n",r_whole);
输出的事有符号乘法的结果:
r_whole = 1860719719092984036
第一段程序里我不是对 x1 进行强制类型转换了吗
1 chingyat 2024 年 4 月 19 日 via iPhone因为后者 xx1 和 xx2 是负数. |
2 Hsinyao 2024 年 4 月 19 日不要纠结这些语法,建议 objdump 看汇编 |
4 ysc3839 2024 年 4 月 19 日 via Android因为 1 没符号,转成有符号类型时也不带符号,2 有符号,转成有符号类型时就会带符号 |
5 cnbatch 2024 年 4 月 19 日写成这样就容易懂了: uint32_t x1 = 0xaeb1c2aa; // 2930885290 int64_t var1 = x1; long long r_whole = var1 * var2; x1 和 x2 强制转换成 signed long long 的时候,实际上就相当于 int64_t var1 = x1; |
6 iceheart 2024 年 4 月 20 日 via Android第二个数值溢出,转成 int 型变成负数了 |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。