我无法理解为什么会这样
#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
答案 0 :(得分:3)
答案 1 :(得分:3)
每个[u]int_t
类型都有printf
格式的宏。
#include <inttypes.h>
printf("%" PRId16 "\n", value);
会正确打印您的值。
应使用宏名称中的d
,因为这是签名类型,16
适用于类型的宽度。使用h
格式修饰符可能并不总是正确的,例如在int16_t
与int
相同而不是short
的机器上。
编辑:如果您确实希望将value
视为十六进制,则应首先使用其他类型。 C中的整数标记始终具有正值,因此在您的示例中,0xFC7F
大于0x7FFF
并确实不适合int16_t
。十六进制常量的“第一个拟合”规则意味着它具有无符号或超过16位的类型。您的初始化将实现定义方式中的此正值转换为有符号值。不要这样做,这可能不便携。
如果你只对它们的位模式感兴趣整数(并且基本上是十六进制打印输出),请使用无符号类型
uint16_t value = 0xFC7F;
并用
打印printf("%" PRIX16 "\n", value);
或
printf("%#" PRIX16 "\n", value);
如果您想使用0x
前缀。