2025-11-20 05:25:39
printf能输出负数是因为它用二进制补码处理有符号整数。比如你用%ld格式输出-5,printf先判断这个数是不是负数,如果是就先输出负号,再处理数值部分。计算机里负数是用补码存储的,比如-5的二进制是补码11111011,printf会把这个二进制数转换成十进制显示,同时自动加上负号。
这个答案成立是因为printf的格式说明符%ld专门处理有符号长整型。根据C标准库文档(C11标准),%ld要求编译器能处理32位或64位有符号整数,负数范围是-到(32位)或-54775808到54775807(64位)。当遇到负数时,printf会先检查符号位是否为1,如果是就输出ASCII码-(31),再输出数值部分。比如输出-5时,实际输出的是31+5=36个字符,其中第一个字符是31。这样每输出一个负数,就会比正数多占一个字节,后续数据的位置就会自动偏移。比如连续输出-1和1,内存地址会相差一个字节。
本题链接: