搬瓦工官网中国镜像站:https://bwh81.net(搬瓦工官方网站,放心访问)
搬瓦工官方中文网:https://bwh86.net
搬瓦工官网所有方案以及库存监控页面:https://bwh86.net/monitor
最新搬瓦工最大优惠力度优惠码(循环优惠6.58%):BWHNCXNVXV
搬瓦工新用户注册和图文购买教程:点击查看
使用printf时,它们具有相同的格式说明符,但使用scanf时,它们没有相同的格式说明符。
为什么是这样?因为printf的参数被提升,而scanf的参数(作为指针)却不被提升。
这种论点提升到底是什么?当较小尺寸的参数(特别是char,short和float)传递给可变参数函数(如printf之类的函数,其参数数量不固定)时,它们将转换为较大尺寸。Char和short转换为int,float转换为double。
为什么这样 据我所知,纯粹出于历史原因。C的设计师认为这是个好主意,因为这些转换基本上是免费的,因为所有类型的尺寸都足够小,可以放入单个寄存器或堆栈中的单个“单元”(将内容压入堆栈必须与某些字节边界对齐,例如,堆栈上的每个项目都必须以4的倍数的地址开头。同样,显然,这种转换减少了传递参数时的错误。
因此,当您向printf传递float类型的参数时,实际上它会在转换为printf之前就转换为double类型。我们可以使用调试器证明这一点。我写了下面的C代码:
主要功能编译成:
领取关于C/C++更多学习资料:
我在调用printf之前(在地址0x63b处)放了一个断点。根据Linux x86_64调用约定,浮点参数在XMM寄存器中传递(CPU中特殊的小内存位置,可用于对多条数据并行执行同一条指令,但实际上可用于大多数事情) 。因此,我查看了第一个XMM寄存器xmm0,然后:
xmm0中的值之一,当解释为双精度值时,是1,恰好是我们传递给printf的值。同时,当将该寄存器中的值解释为浮点数时,它们是这样(巧合的是,我们得到1.875)。因此,转换确实发生了。这就解释了为什么对于printf,我们在浮点数和双精度参数中都使用%f -浮点数无论如何都会转换为双精度,因此printf不能分辨出两者之间的区别。
同时,scanf的参数是指针,因此不受此转换的限制。其原因是因为所有指针类型仅包含内存地址,并且所有内存地址都具有相同的大小(在我的64位计算机上为64位)。因此,当scanf在其格式字符串中获得%f时,它将期望一个float *类型的指针,而当它获得%lf时,将期望得到double *类型的指针。如果格式说明符和指针的类型不匹配,则会产生一些有趣的结果。
由于float的大小为4个字节,而double的大小为8个字节(至少在我的机器上),因此当我们写入float *类型的指针所指向的位置时,我们将覆盖4个字节的内存。同时,如果我们写入由双*指向的位置,则将覆盖8个字节的内存。考虑以下代码:
printf说明符上的.15标志只是使printf精确度更高。由于我们使用的是双精度值(并且正如我刚刚说的那样,%f也适用于printf的双精度值),因此我们实际上可以访问具有这种精度的数字(只要它们不是太大而不能填充即可。我实际上不是对浮点表示非常了解)
编译并运行后,结果如下:
如您所见,如果我们忽略所有类型的fuckery,则数字应该匹配,但它们甚至不相近。这是为什么?
好吧,我们给scanf%f说明符,所以它期望一个浮点数*。但是我们传递了一个双*。现在,这些指针的实际值都只是地址-scanf不知道它们之间的区别。它进行了下去,读取我们输入的值,并将其存储为float 。但是浮点数仅占用4个字节,因此scanf只会在我们可用的double变量的8个字节中写入4个字节。在我的情况下,由于我的机器是低位字节序的,因此似乎对应于double变量的细粒度(小有效位)数字的第4个字节将被覆盖。因此,当我们打印出double double back时,我们得到的数字几乎与以前相同,但最低有效数字有所变化。
搬瓦工机房方案整理
搬瓦工目前提供了4个方案,包括搬瓦工KVM方案,搬瓦工CN2 GT方案,搬瓦工CN2 GIA-E方案和搬瓦工香港方案,每种方案有多种套餐配置,详细的配置和价格整理如下:套餐名称 | CPU | 内存大小 | 硬盘容量 | 每月流量 | 带宽 | 价格/年 | 购买链接 |
---|---|---|---|---|---|---|---|
搬瓦工CN2-E限量版(搬瓦工补货通知群(禁言,仅推送):903230558) | |||||||
CN2 GIA LIMITED EDITION | 1核 | 1 GB | 10 GB | 500 GB | 1 Gbps | $89.99 | 立即购买 |
搬瓦工CN2 GT方案 | |||||||
CN2 | 1核 | 1024 MB | 20 GB | 1000 GB | 1 Gbps | $49.99 | 立即购买 |
CN2 | 1核 | 2048 MB | 40 GB | 2000 GB | 1 Gbps | $99.99 | 立即购买 |
CN2 | 2核 | 4096 MB | 80 GB | 3000 GB | 1 Gbps | $199.99 | 立即购买 |
CN2 | 2核 | 8 GB | 160 GB | 5000 GB | 1 Gbps | $399.99 | 立即购买 |
CN2 | 3核 | 16 GB | 320 GB | 8000 GB | 1 Gbps | $799.99 | 立即购买 |
CN2大流量 | 3核 | 16 GB | 320 GB | 12000 GB | 1 Gbps | $899.99 | 立即购买 |
CN2大流量 | 3核 | 16 GB | 320 GB | 16000 GB | 1 Gbps | $1299.99 | 立即购买 |
搬瓦工CN2 GIA-E方案(可选搬瓦工DC9 CN2 GIA,搬瓦工DC6 CN2 GIA,搬瓦工日本大阪软银线路) | |||||||
CN2 GIA ECOMMERCE | 2核 | 1 GB | 20 GB | 1000 GB | 2.5 Gbps | $169.99 | 立即购买 |
CN2 GIA ECOMMERCE | 3核 | 2 GB | 40 GB | 2000 GB | 2.5 Gbps | $299.99 | 立即购买 |
CN2 GIA ECOMMERCE | 4核 | 4 GB | 80 GB | 3000 GB | 2.5 Gbps | $549.99 | 立即购买 |
CN2 GIA ECOMMERCE | 6核 | 8 GB | 160 GB | 5000 GB | 5 Gbps | $879.99 | 立即购买 |
CN2 GIA ECOMMERCE | 8核 | 16 GB | 320 GB | 8000 GB | 5 Gbps | $1599.99 | 立即购买 |
CN2 GIA ECOMMERCE | 10核 | 32 GB | 640 GB | 10000 GB | 10 Gbps | $2759.99 | 立即购买 |
CN2 GIA ECOMMERCE | 12核 | 64 GB | 1280 GB | 12000 GB | 10 Gbps | $5399.99 | 立即购买 |
搬瓦工香港方案 | |||||||
香港CN2 GIA | 2核 | 2048 MB | 40 GB | 500 GB | 1 Gbps | $899.99 | 立即购买 |
香港CN2 GIA | 4核 | 4096 MB | 80 GB | 1000 GB | 1 Gbps | $1559.99 | 立即购买 |
香港CN2 GIA | 6核 | 8192 MB | 160 GB | 2000 GB | 1 Gbps | $2999.99 | 立即购买 |
香港CN2 GIA | 6核 | 16384 MB | 320 GB | 4000 GB | 1 Gbps | $5899.99 | 立即购买 |
搬瓦工日本方案 | |||||||
日本CN2 GIA | 2核 | 2048 MB | 40 GB | 500 GB | 1.2 Gbps | $899.99 | 立即购买 |
日本CN2 GIA | 4核 | 4096 MB | 80 GB | 1000 GB | 1.2 Gbps | $1559.99 | 立即购买 |
日本CN2 GIA | 6核 | 8192 MB | 160 GB | 2000 GB | 1.2 Gbps | $2999.99 | 立即购买 |
日本CN2 GIA | 6核 | 16384 MB | 320 GB | 4000 GB | 1.2 Gbps | $5899.99 | 立即购买 |
搬瓦工KVM方案 | |||||||
KVM | 2核 | 1024 MB | 20 GB | 1 TB | 1 Gbps | $49.99 | 立即购买 |
KVM | 3核 | 2 GB | 40 GB | 2 TB | 1 Gbps | $99.99 | 立即购买 |
KVM | 4核 | 4 GB | 80 GB | 3 TB | 1 Gbps | $199.99 | 立即购买 |
KVM | 5核 | 8 GB | 160 GB | 4 TB | 1 Gbps | $399.99 | 立即购买 |
KVM | 6核 | 16 GB | 320 GB | 5 TB | 1 Gbps | $799.99 | 立即购买 |
KVM | 7核 | 24 GB | 480GB | 6 TB | 1 Gbps | $1,199.99 | 立即购买 |
还木有评论哦,快来抢沙发吧~