在处理 long long 类型的负数时,特别是极值(如 0x8000000000000000LL),直接取反操作 value = -value; 可能会导致溢出问题。因为 0x8000000000000000LL 是 long long 类型的最小值,其绝对值超出了 long long 类型的正数范围
1 2 3 4 5 6
longlong value; // Set '-' for negative decimals. if (value < 0 && base == 10) { *str++ = '-'; value = -value; }
使用无符号类型:在处理负数时,将其转换为无符号类型 unsigned long long,以避免溢出问题。
1 2 3 4 5 6 7 8
unsignedlonglong uvalue; // Set '-' for negative decimals. if (value < 0 && base == 10) { *str++ = '-'; uvalue = (unsignedlonglong)(-value); } else { uvalue = (unsignedlonglong)value; }
[mtrace] read data 0xbc025800 from pmem 0x800012d5 [mtrace] read data 0xfef42223 from pmem 0x80000178 [mtrace] write data 0xbc025800 to pmem 0x80009fd4