为何调用ft_putchar(5*10)输出为2?我预期输出应为5
问题原因解析
1. ASCII码的认知偏差
你期望输出字符'5',但字符'5'对应的ASCII码值是53,而你传入的5*10=50对应的ASCII字符是'2'(因为'0'的ASCII码是48,50-48=2)。这是预期与结果不符的基础原因,而实际输出'2'还和write的字节写入逻辑、内存字节序有关。
2. 字节序与write的写入逻辑
在绝大多数现代系统(如x86/x86_64)中,C语言的int类型占4字节。当你传入50作为int参数时,它的十六进制表示为0x00000032。
当前系统几乎都是**小端序(Little Endian)**存储:多字节数据的低字节会存放在内存的低地址处。也就是说,int 50在内存中的字节排列顺序是:
- 低地址:
0x32(对应十进制50) - 后续三个字节:
0x00、0x00、0x00
你的ft_putchar函数调用write(1, &c, 1),仅从int c的内存起始地址(低地址)读取1个字节写入标准输出,这个字节就是0x32(十进制50),对应ASCII字符'2',所以最终输出为'2'。
修正方案
如果想输出字符'5',直接传入字符常量'5'(等价于传入ASCII码值53)即可:
#include <unistd.h> void ft_putchar(int c){ write(1, &c, 1); } int main(){ ft_putchar('5'); // 等价于 ft_putchar(53); }
更严谨的写法是将参数类型改为char,避免字节序带来的潜在问题:
#include <unistd.h> void ft_putchar(char c){ write(1, &c, 1); } int main(){ ft_putchar('5'); }
内容的提问来源于stack exchange,提问作者user13350466
相关产品推荐
相关产品推荐

