You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中能否对uint64_t指针下标访问获取部分字节内容?

解答

你的理解完全正确,针对两个疑问具体说明如下:

  • 对uint8_t first_byte = ((uint8_t *)num_ptr)[0];的逻辑拆解完全符合C语言的语法规则:
    1. 第一步(uint8_t *)num_ptr是将原本指向uint64_t类型的指针,强制转换为指向uint8_t类型的指针,这个转换不会改变指针存储的内存地址,仅修改了指针的步长和内存解读规则:原uint64_t*指针每次偏移移动8字节,强转后的uint8_t*指针每次偏移移动1字节。
    2. C语言中指针的下标运算p[i]本质完全等价于*(p + i),因此((uint8_t *)num_ptr)[0]就等价于从num_ptr指向的内存起始地址开始,取偏移量为0的1字节内容,不需要先对原uint64_t*指针做完整的8字节解引用。
  • 你提到的「不对指针做完整解引用,直接通过下标索引获取指向内容的部分字节」是完全合法且常用的C语言底层操作,但有两个必须注意的规则:
    1. 只有转换为指向字符类类型(char、unsigned char/uint8_t、signed char/int8_t)的指针,才允许逐字节遍历其他类型对象的内存,转换为其他非字符类型指针做类似操作会违反严格别名规则,属于未定义行为。
    2. 这种方式获取到的字节内容和系统端序直接相关。你运行代码得到159是小端序系统的正常结果:99999转换为十六进制是0x1869F,补全为8字节uint64_t的完整值为0x000000000001869F,小端序规则下低地址存储值的低有效字节,起始位置的第一个字节是0x9F,转换为十进制就是159;如果在大端序系统上运行同一段代码,第一个字节会取到最高位的0x00,输出结果为0。

内容的提问来源于stack exchange,提问作者wrosen01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 03:03:22