C#中int类型显示48而非0的问题排查求助
解决字符'0'转int时获取ASCII值而非十进制数值的问题
我明白你的困扰了——你把存储的字符串型'0'直接转成int的时候,拿到的是它的ASCII码48,但你实际想要的是十进制数值0对吧?而且你提到调试时变量u显示为0,这说明你可能在某个地方已经做对了转换逻辑,但往TRUCKS数组里存储的时候没处理好字符到数值的转换。
问题根源
字符串中的每个字符'0'本身的ASCII值就是48,所以如果直接把char类型强制转换为int,得到的会是字符的ASCII编码,而非你需要的十进制数值0。
解决方案:字符转十进制数值的两种常用方法
你可以在将字符串中的字符存入TRUCKS数组前,先做一步转换:
方法1:利用字符ASCII码的差值计算
因为数字字符的ASCII码是连续的('0'=48,'1'=49,…,'9'=57),所以用目标字符减去'0'的ASCII值,就能直接得到对应的十进制数值:
int numericValue = truckUpgradeArray[arrayPos] - '0';
方法2:使用字符串解析方法(更直观,容错性强)
把单个字符转成字符串后,用int.Parse()或者更安全的int.TryParse()来解析成数值:
// 基础解析 int numericValue = int.Parse(truckUpgradeArray[arrayPos].ToString()); // 安全解析(推荐,避免转换失败报错) if (int.TryParse(truckUpgradeArray[arrayPos].ToString(), out int value)) { numericValue = value; } else { // 处理转换失败的情况,比如默认设为0 numericValue = 0; }
结合你的代码修改示例
把转换逻辑整合到loadUpgrades方法中,完整示例如下:
void loadUpgrades() { truckUpgradeArray = null; int arrayPos = 0; truckUpgradeArray = PlayerPrefs.GetString("yourUpgradeKey"); // 替换为你实际使用的PlayerPrefs键名 // 初始化TRUCKS数组(假设长度为6) int[] TRUCKS = new int[6]; // 遍历字符串,逐个转换并存入数组 for (arrayPos = 0; arrayPos < truckUpgradeArray.Length && arrayPos < 6; arrayPos++) { // 这里用方法1的差值转换,也可以替换成方法2的解析逻辑 TRUCKS[arrayPos] = truckUpgradeArray[arrayPos] - '0'; } }
关于调试时变量u显示为0的说明
你提到调试时变量u的值是0,这大概率是因为u是已经经过上述转换后的数值,而你之前往TRUCKS数组存储时没做转换,所以数组里存的是字符的ASCII码48,两者的差异正好对应了你的描述。
额外注意事项
- 要确保
truckUpgradeArray的长度至少为6,或者在循环中加入边界判断,避免出现索引越界的错误; - 如果
PlayerPrefs中取出的字符串可能为空、长度不足或者包含非数字字符,建议加入容错逻辑,比如给数组默认填充0。
内容的提问来源于stack exchange,提问作者Simply Eddie
相关产品推荐
相关产品推荐

