我试图在contikiOS中测试一些计时器,我使用printf()输出变量的值,但打印值根据我打印信息的方式而改变。
我是什么意思?,我打印两个变量,RTIMER_SECOND是一个长的无符号整数,而CLOCK_SECOND是一个整数。下面的变化是我试过的,输出是下面的代码:
printf("1->RTIMER_SECOND=%lu CLOCK_SECOND=%d\n", RTIMER_SECOND, CLOCK_SECOND);
printf("2->RTIMER_SECOND=%d CLOCK_SECOND=%d\n\n", RTIMER_SECOND, CLOCK_SECOND);
printf("3->CLOCK_SECOND=%d RTIMER_SECOND=%lu\n", CLOCK_SECOND,RTIMER_SECOND);
printf("4->CLOCK_SECOND=%d RTIMER_SECOND=%d\n\n", CLOCK_SECOND,RTIMER_SECOND);
printf("Ticks per second: %lu\n", RTIMER_SECOND);
printf("second per second: %d\n", CLOCK_SECOND);
输出是这样的:
1-> RTIMER_SECOND = 15625 CLOCK_SECOND = 128
2-> RTIMER_SECOND = 15625 CLOCK_SECOND = 0
3-> CLOCK_SECOND = 128 RTIMER_SECOND = 15625
4-> CLOCK_SECOND = 128 RTIMER_SECOND = 15625
每秒蜱数:15625
每秒秒数:128
我的问题是为什么0出现在第二个印刷品中?打印%d而不是影响下一个变量的RTIMER_SECOND的%lu时,是未定义的行为? PS:第4个是第2个的反向,CLOCK_SECOND的值不是0。
答案 0 :(得分:2)
printf()
将由操作系统实施。我不知道实施的细节。
我的猜测是变量作为堆栈上的字节序列传递给printf()。说明符字符串告诉函数在打印输出时要消耗多少字节。
长无符号整数是4个字节,可能是小端序。由于15625小于2 ^ 16,所以RTIMER_SECOND的最后两个字节都是0.当字符串告诉函数只为RTIMER_SECOND打印2个字节时,接下来的两个0字节被解释为CLOCK_SECOND的两个字节。
为了测试这个假设,尝试传入RTIMER_SECOND的值,该值超过2个字节,即大于65536.在这种情况下,第4行也将被搞砸。