我想知道为什么图像中的以下两张照片不相同?
uint16_t linCalc(uint16_t adcAverage){
float k = 2500 / 2500;
float j = 8000 / 5000;
int a = 1000 * (j - k);
printf("a = %d\n", a);
k = 1;
j = 1.6;
int b = 1000 * (j - k);
printf("b = %d\n", b);
}
b = 600 a = 0 b = 600 a = 0 b = 600 a = 0 b = 600 a = 0 b = 600 a = 0 b = 600 a = 0 b = 600 a = 0 b = 600
在计算表达式之前,似乎浮点数被称为int(我还试图在声明中对浮点数进行类型转换)。
答案 0 :(得分:5)
它们不相同,因为8000/5000
执行整数除法,因为两个操作数都是int
常量。除法的结果是1
。
要强制浮点除法,至少有一个操作数需要为float
。这可以通过几种方式实现,即(并按优先顺序):
8000.0f / 5000
(float)8000 / 5000
答案 1 :(得分:1)
float j = 8000 / 5000
收益1
; rhs表达式8000 / 5000
在评估后转换为浮点数; 8000
和5000
是数据类型int
的文字,因此8000 / 5000
也是int
。
写float j = 8000.0 / 5000.0
以产生浮点除法。
答案 2 :(得分:-1)
在第一种情况下,k = 1.0且j = 1.0,在第二种情况下,k = 1.0且j = 1.6。 发生这种情况是因为在第一种情况下,您将整数与另一个整数相除,因此结果为整数,然后在分配给k和j时将其存储到浮点数中。
package main
import (
"fmt"
)
type X struct{
Y []string
}
func modify(x X) {
x.Y = append(x.Y, "modify")
}
func (x X) change() {
x.Y = append(x.Y, "modify")
}
func main() {
x := X{}
modify(x)
x.change()
fmt.Printf("%+v\n", x)
}
如果你想阻止你可以在分部中明确使用浮点数(或至少一个浮点数):
julien@ubuntu:/tmp/so$ cat main.c
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
float k;
float j;
int a;
int b;
k = 2500 / 2500;
j = 8000 / 5000;
printf("k = %f, j = %f\n", k, j);
a = 1000 * (j - k);
printf("a = %d\n", a);
k = 1;
j = 1.6;
b = 1000 * (j - k);
printf("b = %d\n", b);
return (EXIT_SUCCESS);
}
julien@ubuntu:/tmp/so$ gcc -Wall -Werror -pedantic -Wextra main.c -o ben && ./ben
k = 1.000000, j = 1.000000
a = 0
b = 600
julien@ubuntu:/tmp/so$