同小端字节序机器memcmp结果异常:CentOS与RHEL输出不同
问题分析与解答
你的问题核心在于**memcmp的返回值类型是int,而你用short int类型的变量去存储这个返回值,导致了依赖系统/编译器实现的异常转换行为**。具体拆解如下:
memcmp的返回值规范
C标准明确规定memcmp的返回值类型是int:当第一个参数指向的内存小于第二个时返回负数,等于时返回0,大于时返回正数。但标准并未限定返回的具体数值——不同系统的memcmp实现可能返回不同的负数(比如有的返回第一个不同字节的差值,有的直接返回-1)。short int存储int返回值的风险short int的宽度通常为16位,而int在多数系统中是32位。当把32位的int值赋值给16位的short int时:
- 如果
int值超出short int的表示范围(-32768~32767),结果是实现定义的(不同编译器/系统可能处理方式不同); - 即使值在范围内,某些编译器的优化逻辑也可能导致意外的截断或转换。
- 你的案例解释
- 在CentOS上,
memcmp返回了第一个不同字节的差值1-5=-4,这个值在short int的范围内,因此ret正确存储为-4,printf输出-4; - 在RHEL上,
memcmp的实现可能返回了一个超出short int范围的负数,或者编译器优化导致赋值时截断后变为0,最终ret的值为0。
- 改为
int后正常的原因
当ret声明为int时,它的类型和memcmp的返回值类型完全匹配,返回值可以被完整存储,不会发生截断或实现定义的转换,因此两个系统都能正确保留memcmp的非零返回值,输出一致。
内容的提问来源于stack exchange,提问作者user3899508
相关产品推荐
相关产品推荐

