C类型转换问题(Float断言为Int)

时间:2017-01-25 21:43:08

标签: c

我想知道为什么图像中的以下两张照片不相同?

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(我还试图在声明中对浮点数进行类型转换)。

3 个答案:

答案 0 :(得分:5)

它们不相同,因为8000/5000执行整数除法,因为两个操作数都是int常量。除法的结果是1

要强制浮点除法,至少有一个操作数需要为float。这可以通过几种方式实现,即(并按优先顺序):

  1. 8000.0f / 5000
  2. (float)8000 / 5000

答案 1 :(得分:1)

float j = 8000 / 5000收益1; rhs表达式8000 / 5000在评估后转换为浮点数; 80005000是数据类型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$