zoukankan      html  css  js  c++  java
  • 转发一个关于printf的

    转发帖子,已经不记得作者是谁,还是感谢原作者。

     

    int64_t a = 1;

    printf("%d\n", a);

    结果是多少呢?当然是1,你可能会说。

    我们来看一下结果:

     

    1

    果然是1!但是你会不会以为是 首先被自动转化成了 int 类型,然后输入为 1的呢?

    如果真这么简单,本文到此也该结束了。我们换一个写法:

     

    int64_t a = 1;

    int b = 2;

    printf("%d, %d\n", a, b);

    这次的结果是多少呢?和 2?真的吗?我们来看一下结果:

     

    1, 0

    好吧,你可能该惊讶了。然而这个结果的确是对的。

    如果你还是觉得不可相信,我们再来看一个代码:

    uint32_t uin = 1;

    printf("%llu\n", uin);

    输入结果是:

     

    13827625253599182849

    这是个随机值。也许你会说,不对呀,应该是 呀?

     

    这就涉及到 printf 的设计了,printf的第一个参数永远是字符串,他会解析每一个类似 %d 的结构,然后对指针做对应长度的偏移,如%d4%lld就是8(为什么要偏移,请参看这里 从printf谈可变参数函数的实现)

    所以,当执行如下代码

     

    int64_t a = 1;

    int b = 2;

    printf("%d, %d\n", a, b);

    实际上两个%d分别取得是 的低4字节和高4字节,从而分别是10(这里还涉及到大小端的问题,本机是小端存储)。

    而对于

     

    uint32_t uin = 1;

    printf("%llu\n", uin);

    也是一样的道理,先取到的uin作为低4字节,而高4字节则完全随机,从而得到了一个很大的随机数。

    知道了这个原因,我们可以做一个测试:

     

    uint32_t uin = 1;

    uint32_t uin2 = 2;

    printf("%llu\n", uin, uin2);

     

    uint64_t uin3 = uin2;

    uin3 = uin3 << 32;

    uin3 += uin;

    printf("%llu\n", uin3);

    uin2uin先入栈,所以uin2会在高位,uin会在低位。

    如果按照我们所解释的,那两个结果应该完全一致,对不对?我们来看一下输出:

     

    8589934593                                                                                                                                                  

    8589934593

    的确是一样的~

  • 相关阅读:
    linux下解压命令详解
    SSL简介及工作原理
    在CentOS中安装gcc配置c语言开发环境(转)
    JTable表格(隐藏表头)(转)
    一个云平台开源项目Eucalyptus
    「CF645E」 Intellectual Inquiry
    「CERC2017」Donut Drone
    洛谷P3943 星空
    「CSPS 2019」格雷码
    洛谷P3941 入阵曲
  • 原文地址:https://www.cnblogs.com/yemeng/p/2581783.html
Copyright © 2011-2022 走看看