我尝试编写程序代码,但我遇到了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
...
我试图在网上找到可能的答案,但我不知道如何说出问题以获得答案。你能帮帮我吗?
答案 0 :(得分:4)
除了其他答案建议的打印外,您还有以下问题:
答案 1 :(得分:2)
您的代码会导致undefined behavior。
标记值#
不应与u
转化说明符一起使用。
引用C11
,章节§7.21.6.1
#
结果转换为“替代形式”。对于o
转换,它会增加 精度,当且仅在必要时,强制结果的第一个数字为a 零(如果值和精度均为0,则打印单个0)。对于x
(或X
) 转换时,非零结果的前缀为0x
(或0X
)。对于a
,A
,e
,E
,f
,F
,g
, 和G
转换,总是转换浮点数的结果 包含小数点字符,即使后面没有数字。 (通常,a 只有数字时,小数点字符才会出现在这些转换的结果中 跟着它。)对于g
和G
次转换,不会删除尾随零 结果。 对于其他转化,行为未定义。
对于固定宽度整数,使用inttypes.h
中定义的格式说明符MACROS,类似于PRIu8
的8位无符号整数类型。
修复此问题后,下一个问题是8位变量溢出。作为described in the other answer by Yunnosch一旦i
变为128
,您将其乘以2,并将结果存储回8位变量,结果为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中定义