为什么下列程序进行的是无符号乘法? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rookiemaster
V2EX    C

为什么下列程序进行的是无符号乘法?

  •  
  •   rookiemaster 2024 年 4 月 19 日 4155 次点击
    这是一个创建于 699 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 进行强制类型转换了吗

    6 条回复    2024-04-20 14:32:11 +08:00
    chingyat
        1
    chingyat  
       2024 年 4 月 19 日 via iPhone
    因为后者 xx1 和 xx2 是负数.
    Hsinyao
        2
    Hsinyao  
       2024 年 4 月 19 日
    不要纠结这些语法,建议 objdump 看汇编
    lindt99cocoa
        3
    lindt99cocoa  
       2024 年 4 月 19 日   1
    无符号数做零扩展,有符号数做符号扩展
    ysc3839
        4
    ysc3839  
       2024 年 4 月 19 日 via Android
    因为 1 没符号,转成有符号类型时也不带符号,2 有符号,转成有符号类型时就会带符号
    cnbatch
        5
    cnbatch  
       2024 年 4 月 19 日
    写成这样就容易懂了:

    uint32_t x1 = 0xaeb1c2aa; // 2930885290
    uint32_t x2 = 0xaeb1c2aa;

    int64_t var1 = x1;
    int64_t var2 = x2;

    long long r_whole = var1 * var2;

    x1 和 x2 强制转换成 signed long long 的时候,实际上就相当于 int64_t var1 = x1;
    有符号 long long 能够容纳的范围足够大,大到可以完整“吞下”整个 0xaeb1c2aa
    iceheart
        6
    iceheart  
       2024 年 4 月 20 日 via Android
    第二个数值溢出,转成 int 型变成负数了
    int 扩展成 long long ,高位按符号位扩展,所以仍是负数。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     944 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 21:33 PVG 05:33 LAX 14:33 JFK 17:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86