【问题标题】:Why does not uint16_t show the desired output?为什么 uint16_t 不显示所需的输出?
【发布时间】:2013-12-18 14:27:49
【问题描述】:

我有一个数组-

uint8_t arrayTest[] = {
    0, 0xC1,                
    0, 0, 0, 0x0a,          
    0, 0, 0, 0x50           
 };

因此,以下带有 uint32_tprintf 显示了正确的输出“a”:

printf("%x ",ntohl(*((uint32_t *)(arrayTest+2))));

但是uint16_t显示不正确,虽然我把数组指针转发了两个字段,但输出是“a0000”-

printf("%x ",ntohl(*((uint16_t *)(arrayTest+4))));

当我使用 %d 时也是这样:

printf("%d ",ntohl(*((uint32_t *)(arrayTest+2)))); 的输出是“10

printf("%d ",ntohl(*((uint16_t *)(arrayTest+4)))); 的输出是“655360

为什么???

【问题讨论】:

  • 您在此处调用 未定义的行为(通过这些指针转换取消引用)。
  • printf 不是一个安全函数。使用时要小心谨慎。这包括reading the manual
  • 请注意,16 位数据有一个 ntohs() 函数,32 位数据有一个 ntohl() 函数。
  • 谢谢你,它工作得很好。

标签: c arrays pointers uint32 uint16


【解决方案1】:

nothl 用于转换 32 位数量。对于 16 位数量,它会产生不正确的结果,至少在小端系统上是这样。为此使用ntohs

【讨论】:

    猜你喜欢
    • 2022-11-20
    • 2015-05-06
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多