C++中用字符串流将4字符十六进制字符串转为有符号短整型问题
嘿,这个问题其实戳中了C/C++里整数常量类型和赋值转换的一个细节,咱们一步步理清楚:
首先,0xffff的真实身份
你可能以为0xffff是个2字节的数值,但在C/C++里,十六进制常量默认是int类型(一般是4字节)。所以0xffff作为int的值是65535——一个正整数,而不是-1。
赋值给short时的转换规则
当你把这个4字节的int值65535赋值给2字节的short变量时,会发生截断:只保留低2字节的内容(也就是0xffff)。但这里有个关键:如果原int值超出了有符号short的取值范围(-32768 到 32767),这种转换的结果是实现定义的——不过绝大多数主流编译器会按照补码规则处理,把0xffff的二进制全1解释为有符号short的-1。
为什么你的s1不是-1?
如果你的程序输出s1不是-1,大概率是这几个原因之一:
- 变量类型搞错了:你可能把s1声明成了
unsigned short而非short,这时候0xffff就是无符号的65535,自然不是-1。 - 编译器特殊设置:某些嵌入式编译器或者特殊编译选项下,short可能被默认当作无符号类型(这不符合C标准,但确实存在)。
- 代码里的隐式转换干扰:比如s1的赋值过程中还有其他类型转换,比如从unsigned char数组转换时的字节序问题(不过这种情况比较少见)。
验证代码
你可以跑一段小代码确认下细节:
#include <stdio.h> int main() { short s1 = 0xffff; short s2 = (short)0xffff; printf("s1 = %d\n", s1); printf("s2 = %d\n", s2); printf("sizeof(int) = %zu, sizeof(short) = %zu\n", sizeof(int), sizeof(short)); return 0; }
如果是标准环境,这里s1和s2都会输出-1;如果你的结果不一样,就去检查变量声明和编译器选项吧。
内容的提问来源于stack exchange,提问作者Kyle Hobbs
相关产品推荐
相关产品推荐

