int16_t变为int32_t F填充

时间:2013-11-29 23:30:23

标签: c

我无法理解为什么会这样

#include <stdio.h>
#include <stdint.h>


typedef int16_t my_type;

my_type value = 0xFC7F;

int main(int argc, const char * argv[])
{
  printf("0x%02X\n", value);
  printf("Type uses %lu bytes\n", sizeof(my_type));
}

输出此

0xFFFFFC7F
Type uses 2 bytes
Program ended with exit code: 0

而不是

0xFC7F
Type uses 2 bytes
Program ended with exit code: 0

我在OSX 10.9上使用XCode 5

2 个答案:

答案 0 :(得分:3)

使用printf格式说明符X进行打印,这是整数。

使用h length specifier将其显示为简短。

Live demo

答案 1 :(得分:3)

每个[u]int_t类型都有printf格式的宏。

#include <inttypes.h>

printf("%" PRId16 "\n", value);

会正确打印您的值。

应使用宏名称中的d,因为这是签名类型,16适用于类型的宽度。使用h格式修饰符可能并不总是正确的,例如在int16_tint相同而不是short的机器上。

编辑:如果您确实希望将value视为十六进制,则应首先使用其他类型。 C中的整数标记始终具有正值,因此在您的示例中,0xFC7F大于0x7FFF并确实不适合int16_t。十六进制常量的“第一个拟合”规则意味着它具有无符号或超过16位的类型。您的初始化将实现定义方式中的此正值转换为有符号值。不要这样做,这可能不便携。

如果你只对它们的位模式感兴趣整数(并且基本上是十六进制打印输出),请使用无符号类型

uint16_t value = 0xFC7F;

并用

打印
printf("%" PRIX16 "\n", value);

printf("%#" PRIX16 "\n", value);

如果您想使用0x前缀。