以下是代码:
#include <stdio.h>
#include <stdint.h>
int main()
{
uint8_t ui8 = 0xff;
printf(" %x\n", ui8);
printf(" %x\n", (uint8_t)24);
printf(" %x\n", ui8 << (uint8_t)24);
}产出如下:
ff
18
ff000000问题是:如果我有两个uint8_t变量,为什么结果会被“提升”到更高的级别。如果它不被提升,为什么我会得到这么大的数字。我没有测试MinGW win7 7-64位平台。
发布于 2017-07-12 12:03:06
<<的两个参数在计算之前都被转换为int,尽管您试图强行解决(uint8_t)24的问题。
这是必然的,因为uint8_t比任何平台上的int都窄。
因此,ff000000,您观察到的结果与平台上至少32位宽的int是一致的。
发布于 2017-07-12 12:02:53
发生的事情叫做http://en.cppreference.com/w/c/language/conversion#Usual_arithmetic_conversions,它导致<<操作符的两个参数的http://en.cppreference.com/w/c/language/conversion#Integer_promotions。
如果您没有在printf参数中直接使用shift表达式,而是将其存储在一个uint8_t变量中,那么结果将为零。但是,当您调用printf时,您将得到一个http://en.cppreference.com/w/c/language/conversion#Default_argument_promotions,它将把uint8_t变量转换为int。但是这会导致另一个问题,因为尽管"%x"期望的格式是int (实际上是unsigned int,参见和家庭参考资料),但数据实际上是一个uint8_t。这意味着您有不匹配的格式说明符和参数,导致未定义的行为。打印uint8_t的正确格式说明符是"%hhx",或者更好地使用PRI8x宏:
uint8_t result = ...
printf("%" PRI8x "\n", result);参见例如此格式宏引用。
https://stackoverflow.com/questions/45057086
复制相似问题