为什么将uint8_t与整数结果乘以0?

时间:2017-08-30 14:23:05

标签: c for-loop

我尝试编写程序代码,但我遇到了1个小段的问题。

for(uint8_t i = 1; i < MAX_BIT_VALUE; i*=2){
            printf("Current value of i: %u\n", i);
}

当我运行此段时,我得到此输出:

  

i的当前值:0

     

i的当前值:0

     

i的当前值:0

     

i的当前值:0

在无限循环中。我不明白为什么。 uint8_t是8位的无符号整数。我只是乘以i,其值为1乘2.它怎么可能变为0?

如果我将i的数据类型更改为int,那么它可以正常运行:

  

i的当前值:1

     

i的当前值:2

     

i的当前值:4

     

i的当前值:8

     

i的当前值:16

...

我试图在网上找到可能的答案,但我不知道如何说出问题以获得答案。你能帮帮我吗?

3 个答案:

答案 0 :(得分:4)

除了其他答案建议的打印外,您还有以下问题:

  • 乘数i == 128乘2
  • 结果256
  • 将其存储在无符号8位的256(0x100)中,结果为0,
    因为8位要缩小
  • 乘以0
  • 结果0
  • 0&lt; 255 - &gt;无尽的循环

答案 1 :(得分:2)

您的代码会导致undefined behavior

标记值#不应与u转化说明符一起使用。

引用C11,章节§7.21.6.1

  

#结果转换为“替代形式”。对于o转换,它会增加   精度,当且仅在必要时,强制结果的第一个数字为a   零(如果值和精度均为0,则打印单个0)。对于x(或X)   转换时,非零结果的前缀为0x(或0X)。对于aAeEfFg,   和G转换,总是转换浮点数的结果   包含小数点字符,即使后面没有数字。 (通常,a   只有数字时,小数点字符才会出现在这些转换的结果中   跟着它。)对于gG次转换,不会删除尾随零   结果。 对于其他转化,行为未定义。

对于固定宽度整数,使用inttypes.h中定义的格式说明符MACROS,类似于PRIu8的8位无符号整数类型。

修复此问题后,下一个问题是8位变量溢出。作为described in the other answer by Yunnosch一旦i变为128,您将其乘以2,并将结果存储回8位变量,结果为0。然后,

  • 0乘以任何东西仍为0
  • for循环i < MAX_BIT_VALUE部分中构成永远为真的条件。

你得到无限循环。

答案 2 :(得分:1)

从以下位置更改printf格式字符串:

  

printf(&#34; i的当前值:%#u \ n&#34;,i);

  

printf(&#34; i的当前值:%&#34; PRIu8&#34; \ n&#34;,i);

它应该没问题。 PRIu8宏在inttypes.h中定义