user-0 提问: Linux下C类型变量转换问题

回复:
user: user-0
content: 引用 10 楼 changhonghuan 的回复:[quote=引用 2 楼 Meteor_Code 的回复:] 栈被你弄错了, printf 看到第一个 %f是,知道你后面有个8字节的double,所以读出一个double,可实际上这个double是你入栈的两个unsigned int c,d构成的,至于c,d为什么能拼成19.900000,你就自己百度double的结构吧 然后看到第2个%lf,知道你后面是一个double,注意,printf 把你的unsigned int c,d看成一个double,所以你第2个%lf实际上读的是myvar这个double,所以是19.900000 第3个%lf,实际上栈中已经没有数值了,读到的东西只不过是栈中的残余内容,恰巧和0.000000差不多,,,  在printf函数的栈中有 c(unsigned int)、d(double)、myvar(double)共20个字节 格式符%f、%lf、%lf分别占8、8、4个字节 实际结果并不是上面所谓的c: 19.900000, d: 19.900000, myvar: 0.000000  我在gcc下的结果 c:190359804756585290800225004697592000611708095954661757616245032484253127904326938471236694422145581236194734089529829625833353930779766597086044360372489629850129256972431021890192015360.000000,d:190359837277366669655647163314481214536991132162652612850933061001090513015105157377943616157470427089203491673116049516810865697391842691589967491289407861429180783102463018374470303744.000000, myvar: -0.139144   [/quote]  我也是红帽6 x86_64下GCC编译后的执行输出结果，为什么和你的差别那么大，难道GCC编译时有参数可以设置打印精度吗？

user: user-0
content: c: 19.900000, d: 19.900000, myvar: 0.000000 以上是我在红帽6 x86_64下的输出结果。     引用 13 楼 Meteor_Code 的回复:[quote=引用 12 楼 changhonghuan 的回复:] [quote=引用 11 楼 Meteor_Code 的回复:] [quote=引用 10 楼 changhonghuan 的回复:] [quote=引用 2 楼 Meteor_Code 的回复:] 栈被你弄错了, printf 看到第一个 %f是,知道你后面有个8字节的double,所以读出一个double,可实际上这个double是你入栈的两个unsigned int c,d构成的,至于c,d为什么能拼成19.900000,你就自己百度double的结构吧 然后看到第2个%lf,知道你后面是一个double,注意,printf 把你的unsigned int c,d看成一个double,所以你第2个%lf实际上读的是myvar这个double,所以是19.900000 第3个%lf,实际上栈中已经没有数值了,读到的东西只不过是栈中的残余内容,恰巧和0.000000差不多,,,  在printf函数的栈中有 c(unsigned int)、d(double)、myvar(double)共20个字节 格式符%f、%lf、%lf分别占8、8、4个字节 实际结果并不是上面所谓的c: 19.900000, d: 19.900000, myvar: 0.000000  我在gcc下的结果 c:190359804756585290800225004697592000611708095954661757616245032484253127904326938471236694422145581236194734089529829625833353930779766597086044360372489629850129256972431021890192015360.000000,d:190359837277366669655647163314481214536991132162652612850933061001090513015105157377943616157470427089203491673116049516810865697391842691589967491289407861429180783102463018374470303744.000000, myvar: -0.139144   [/quote] gcc还区分%f和%lf吗??vs下好像是不区分的,float入栈好像都会被转化成8字节的double[/quote] 对啊，没有区分，所以才是格式符对应的输出字节才是8、8、4[/quote]  格式符%f、%lf、%lf分别占8、8、4个字节??????[/quote]  格式符%f、%lf、%lf应该还是占8、8、8个字节，只不过最后一个读到的后四个字节是不属于我的20个字节范围内的吧？

user: user-1
content: 引用 12 楼 changhonghuan 的回复:[quote=引用 11 楼 Meteor_Code 的回复:] [quote=引用 10 楼 changhonghuan 的回复:] [quote=引用 2 楼 Meteor_Code 的回复:] 栈被你弄错了, printf 看到第一个 %f是,知道你后面有个8字节的double,所以读出一个double,可实际上这个double是你入栈的两个unsigned int c,d构成的,至于c,d为什么能拼成19.900000,你就自己百度double的结构吧 然后看到第2个%lf,知道你后面是一个double,注意,printf 把你的unsigned int c,d看成一个double,所以你第2个%lf实际上读的是myvar这个double,所以是19.900000 第3个%lf,实际上栈中已经没有数值了,读到的东西只不过是栈中的残余内容,恰巧和0.000000差不多,,,  在printf函数的栈中有 c(unsigned int)、d(double)、myvar(double)共20个字节 格式符%f、%lf、%lf分别占8、8、4个字节 实际结果并不是上面所谓的c: 19.900000, d: 19.900000, myvar: 0.000000  我在gcc下的结果 c:190359804756585290800225004697592000611708095954661757616245032484253127904326938471236694422145581236194734089529829625833353930779766597086044360372489629850129256972431021890192015360.000000,d:190359837277366669655647163314481214536991132162652612850933061001090513015105157377943616157470427089203491673116049516810865697391842691589967491289407861429180783102463018374470303744.000000, myvar: -0.139144   [/quote] gcc还区分%f和%lf吗??vs下好像是不区分的,float入栈好像都会被转化成8字节的double[/quote] 对啊，没有区分，所以才是格式符对应的输出字节才是8、8、4[/quote]  格式符%f、%lf、%lf分别占8、8、4个字节??????

user: user-2
content: 引用 11 楼 Meteor_Code 的回复:[quote=引用 10 楼 changhonghuan 的回复:] [quote=引用 2 楼 Meteor_Code 的回复:] 栈被你弄错了, printf 看到第一个 %f是,知道你后面有个8字节的double,所以读出一个double,可实际上这个double是你入栈的两个unsigned int c,d构成的,至于c,d为什么能拼成19.900000,你就自己百度double的结构吧 然后看到第2个%lf,知道你后面是一个double,注意,printf 把你的unsigned int c,d看成一个double,所以你第2个%lf实际上读的是myvar这个double,所以是19.900000 第3个%lf,实际上栈中已经没有数值了,读到的东西只不过是栈中的残余内容,恰巧和0.000000差不多,,,  在printf函数的栈中有 c(unsigned int)、d(double)、myvar(double)共20个字节 格式符%f、%lf、%lf分别占8、8、4个字节 实际结果并不是上面所谓的c: 19.900000, d: 19.900000, myvar: 0.000000  我在gcc下的结果 c:190359804756585290800225004697592000611708095954661757616245032484253127904326938471236694422145581236194734089529829625833353930779766597086044360372489629850129256972431021890192015360.000000,d:190359837277366669655647163314481214536991132162652612850933061001090513015105157377943616157470427089203491673116049516810865697391842691589967491289407861429180783102463018374470303744.000000, myvar: -0.139144   [/quote] gcc还区分%f和%lf吗??vs下好像是不区分的,float入栈好像都会被转化成8字节的double[/quote] 对啊，没有区分，所以才是格式符对应的输出字节才是8、8、4

user: user-1
content: 引用 10 楼 changhonghuan 的回复:[quote=引用 2 楼 Meteor_Code 的回复:] 栈被你弄错了, printf 看到第一个 %f是,知道你后面有个8字节的double,所以读出一个double,可实际上这个double是你入栈的两个unsigned int c,d构成的,至于c,d为什么能拼成19.900000,你就自己百度double的结构吧 然后看到第2个%lf,知道你后面是一个double,注意,printf 把你的unsigned int c,d看成一个double,所以你第2个%lf实际上读的是myvar这个double,所以是19.900000 第3个%lf,实际上栈中已经没有数值了,读到的东西只不过是栈中的残余内容,恰巧和0.000000差不多,,,  在printf函数的栈中有 c(unsigned int)、d(double)、myvar(double)共20个字节 格式符%f、%lf、%lf分别占8、8、4个字节 实际结果并不是上面所谓的c: 19.900000, d: 19.900000, myvar: 0.000000  我在gcc下的结果 c:190359804756585290800225004697592000611708095954661757616245032484253127904326938471236694422145581236194734089529829625833353930779766597086044360372489629850129256972431021890192015360.000000,d:190359837277366669655647163314481214536991132162652612850933061001090513015105157377943616157470427089203491673116049516810865697391842691589967491289407861429180783102463018374470303744.000000, myvar: -0.139144   [/quote] gcc还区分%f和%lf吗??vs下好像是不区分的,float入栈好像都会被转化成8字节的double

user: user-2
content: 引用 2 楼 Meteor_Code 的回复:栈被你弄错了, printf 看到第一个 %f是,知道你后面有个8字节的double,所以读出一个double,可实际上这个double是你入栈的两个unsigned int c,d构成的,至于c,d为什么能拼成19.900000,你就自己百度double的结构吧 然后看到第2个%lf,知道你后面是一个double,注意,printf 把你的unsigned int c,d看成一个double,所以你第2个%lf实际上读的是myvar这个double,所以是19.900000 第3个%lf,实际上栈中已经没有数值了,读到的东西只不过是栈中的残余内容,恰巧和0.000000差不多,,,  在printf函数的栈中有 c(unsigned int)、d(double)、myvar(double)共20个字节 格式符%f、%lf、%lf分别占8、8、4个字节 实际结果并不是上面所谓的c: 19.900000, d: 19.900000, myvar: 0.000000  我在gcc下的结果 c:190359804756585290800225004697592000611708095954661757616245032484253127904326938471236694422145581236194734089529829625833353930779766597086044360372489629850129256972431021890192015360.000000,d:190359837277366669655647163314481214536991132162652612850933061001090513015105157377943616157470427089203491673116049516810865697391842691589967491289407861429180783102463018374470303744.000000, myvar: -0.139144

user: user-1
content: 引用 8 楼 lizhenneng 的回复:各种大牛啊，谢谢。二楼的解释很清楚。 更正以下,其实是我看错了 d是个double, 你第1个%f读到的是c和d低4字节拼成的double 第2个%lf读到的是d高4字节和myvar的低4字节拼成的double 第3个%lf读到的是myvar高4字节和栈中的"残余"拼成的double 所以胡乱了

user: user-0
content: 各种大牛啊，谢谢。二楼的解释很清楚。

user: user-3
content: printf("%按熊猫的格式输出\n",CSDN的lizhenneng); lizhenneng觉得合理的输出应该是……

user: user-4
content: 应该涉及到类型之间的转换和精度问题，你找下这方面的资料

user: user-5
content: 第一个参数和格式控制字符串不一致  后面数据全部错位

user: user-6
content: 什么编译器啊 这么奇葩

user: user-7
content: d是double类型的

user: user-1
content: 栈被你弄错了, printf 看到第一个 %f是,知道你后面有个8字节的double,所以读出一个double,可实际上这个double是你入栈的两个unsigned int c,d构成的,至于c,d为什么能拼成19.900000,你就自己百度double的结构吧 然后看到第2个%lf,知道你后面是一个double,注意,printf 把你的unsigned int c,d看成一个double,所以你第2个%lf实际上读的是myvar这个double,所以是19.900000 第3个%lf,实际上栈中已经没有数值了,读到的东西只不过是栈中的残余内容,恰巧和0.000000差不多,,,

user: user-7
content: c不是整形吗？怎么会是19.9？