C printf有符号整数和小数点,带负号的问题

C 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,

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,我得到

---: +/-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)
轻松解决。