C语言中将ulong值赋值给uint指针的代码运行结果咨询
问题解答
首先确认你对两行核心代码的逻辑理解完全正确:
*block++ = right:先将block当前指向的unsigned int内存单元赋值为right转换后的值,再将block指针向后偏移1个unsigned int长度(即指向数组下一个元素)*block = left:将偏移后的block指向的unsigned int内存单元赋值为left转换后的值
类型转换与存储结果
C语言中整数类型赋值时,会自动做隐式类型转换:将等号右侧的类型转换为左侧的类型,此处是把unsigned long转换为unsigned int,规则为保留低有效位,截断超出unsigned int长度的高有效位,具体表现和平台有关:
- 32位平台下,
unsigned int和unsigned long通常都是4字节,转换不会丢失任何信息,block[0]存储right的完整值,block[1]存储left的完整值 - 64位平台下,
unsigned int通常为4字节,unsigned long通常为8字节,转换时会截断unsigned long的高32位,仅保留低32位存入对应的unsigned int单元
内存覆盖问题说明
不会出现内存覆盖的情况。因为赋值操作会先完成类型转换,实际写入内存的大小固定为sizeof(unsigned int),刚好匹配数组每个元素的长度,两次赋值分别写入block[0]和block[1]两个合法的数组单元,不会越界访问数组外的内存。
C#移植参考
如果要1:1复现原C代码的逻辑,直接将left、right强制转换为uint后赋值给数组对应位置即可,为了屏蔽平台差异保证截断逻辑一致,可以显式取低32位:
block[0] = (uint)(right & 0xFFFFFFFF); block[1] = (uint)(left & 0xFFFFFFFF);
内容的提问来源于stack exchange,提问作者RedCube
相关产品推荐
相关产品推荐

