C++类型转换错误

C++类型转换错误,c++,types,casting,type-conversion,avr,C++,Types,Casting,Type Conversion,Avr,所以我在一个AVR微控制器上做了这个函数,它可以正常工作,但是当我调用 display(1) 4位显示器上显示的值为1.099,而不是1.000 void display(float n) { int8_t i, digit_pos=0; unsigned short digit; PORTC &= ~((1<<MUX_A2) | (1<<MUX_B2) | (1<<MUX_E2)); ENABLE_DISPLAY; for (i=3;i>=

所以我在一个AVR微控制器上做了这个函数,它可以正常工作,但是当我调用

display(1)
4位显示器上显示的值为1.099,而不是1.000

void display(float n) {
int8_t i, digit_pos=0;
unsigned short digit;
PORTC &= ~((1<<MUX_A2) | (1<<MUX_B2) | (1<<MUX_E2));
ENABLE_DISPLAY;

for (i=3;i>=-3;i--)
{
    digit = n/pow(10,i);
    digit = digit%10;
    if (digit==0&&i>0&&digit_pos==0)
        continue;
    if (digit_pos-i<3)
        if (i==0)
            digit += 10;

    PORTD = SegCode[digit];
    PORTC = ((PORTC & (~(3<<MUX_A2))) | (digit_pos<<MUX_A2)) & ~(1<<MUX_E2);
    PORTC |= (1<<MUX_E2);
    if (digit_pos==3)
        break;
    else
        digit_pos++;
}

PORTD=0x00;
}
是因为类型转换吗?这是因为某些8位RISC处理器的限制吗?

数字被声明为无符号短字符,因此分配给它的任何十进制值都将被截断。您正在进行的除法将产生一个浮点值,您试图将其存储为数字,因此它将被截断以存储为无符号短字符

如果可以节省空间,您可能需要将数字类型更改为浮点。

数字被声明为无符号短字符,因此分配给它的任何十进制值都将被截断。您正在进行的除法将产生一个浮点值,您试图将其存储为数字,因此它将被截断以存储为无符号短字符


如果可以节省空间,您可能需要将数字类型更改为浮点。

这是因为类型转换

浮点是不精确的,所以当您在浮点中执行1/.01和1/.001时,会得到略小于100和1000的值。我不想那么彻底地追踪你的代码,但这就是问题所在。这四舍五入到99和999,这就是为什么9会出现在输出中

如果可以的话,你最好做整数运算。通过将最后一个预期数字的值加一半来防止向下舍入

看起来您期望的值介于0.001和9999之间。快速实现将使用以下用例:

if (n > 9999) error
else if (n >= 1000) {dec = (int)(n + 0.5); shift = 0;}
else if (n >= 100) {dec = (int)(10*(n + 0.05)); shift = 1;}
and so on

then do stuff with dec
另一个提示,您不需要使用%运算符。从右侧开始计算数字,并在显示前存储它们

dec_next = dec / 10;
digit = dec - 10*dec_next;
dec = dec_next;

这是因为类型转换

浮点是不精确的,所以当您在浮点中执行1/.01和1/.001时,会得到略小于100和1000的值。我不想那么彻底地追踪你的代码,但这就是问题所在。这四舍五入到99和999,这就是为什么9会出现在输出中

如果可以的话,你最好做整数运算。通过将最后一个预期数字的值加一半来防止向下舍入

看起来您期望的值介于0.001和9999之间。快速实现将使用以下用例:

if (n > 9999) error
else if (n >= 1000) {dec = (int)(n + 0.5); shift = 0;}
else if (n >= 100) {dec = (int)(10*(n + 0.05)); shift = 1;}
and so on

then do stuff with dec
另一个提示,您不需要使用%运算符。从右侧开始计算数字,并在显示前存储它们

dec_next = dec / 10;
digit = dec - 10*dec_next;
dec = dec_next;

我不能真正使数字浮动,因为它用于从SegCode[digit]中选择数组元素,它必须是整数。此外,截断发生在哪里?就像1/10^-2=100,然后数字是100%10=0,但由于某种原因代码返回9。我不能真正使数字浮动,因为它用于从SegCode[digit]中选择数组元素,它必须是整数。此外,截断在哪里发生?这就像1/10^-2=100,然后数字是100%10=0,但出于某种原因,代码返回9。