C printf有符号整数和小数点,带负号的问题
dsPIC33,XC16编译器 dat1被签名为INT16,其中其值为16434和-16434,打印为164.34和-164.34C printf有符号整数和小数点,带负号的问题,c,printf,C,Printf,dsPIC33,XC16编译器 dat1被签名为INT16,其中其值为16434和-16434,打印为164.34和-164.34 printf("---: +/-180 from North %d.%02d (deg)\n",(dat1/100),(dat1%100)); 当dat1=164.34时,我得到 ---: +/-180 from North -164.34 (deg) ---: +/-180 from North -164.-34 (deg) 用dat1=-164.34,
printf("---: +/-180 from North %d.%02d (deg)\n",(dat1/100),(dat1%100));
当dat1=164.34时,我得到
---: +/-180 from North -164.34 (deg)
---: +/-180 from North -164.-34 (deg)
用dat1=-164.34,我得到
---: +/-180 from North -164.34 (deg)
---: +/-180 from North -164.-34 (deg)
==>如何去掉“-.34”上的减号?您的陈述几乎是正确的,只是您想去掉第二个数字中的减号。您可以使用此语句
printf("---: +/-180 from North %d.%02d (deg)\n", dat1/100, abs(dat1)%100);
编辑:感谢@chux
上述代码在-180.00到180.0度的理想范围内工作。当需要更通用的方法时,应在调用abs()
之前移动模运算
推迟abs()
可以避免在INT\u MIN出现问题,因为abs(INT\u MIN)
可能会产生意外的结果。那么代码应该是:
printf("---: +/-180 from North %d.%02d (deg)\n", dat1 / 100, abs(dat1 % 100));
那么
abs(dat1)%100
?小调:最好做abs(dat1%100)
应该data1==MIN\u INT
@chux你在哪里看到括号中的差异?在-18000到18000的范围内,你应该不会有问题。定点算法总是限制在定义的范围内。如果范围限制在-18000到18000之间,当然没有问题。不过,作为一个通用答案,使用abs(dat1)
其中dat1
是一些有符号整数,在2的补码abs(INT_MIN)
的单数情况下是一个问题,这是一种未定义的行为。这可以通过abs(dat1%100)
轻松解决。