You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言unsigned long使用%d输出结果异常问题问询

问题原因分析
  • 核心问题是printf的格式说明符和传入参数类型不匹配,这属于C标准定义的未定义行为,出现任何输出结果都符合规则,和unsigned long本身的特性无关。
  1. %d格式说明符要求传入的参数必须是signed int类型。printf作为可变参数函数,不会自动识别传入参数的实际类型,只会严格按照你写的格式说明符去解析对应内存地址的内容。
  2. 第一次测试的2200000000UL已经超过32位signed int的最大值2147483647,其二进制32位最高位为1,按signed int解析时会被识别为负数,所以输出-2094967296,符合你观测到的结果。
  3. 第二次测试的2100000000小于32位signed int的最大值2147483647,其二进制32位最高位为0,此时按signed int解析得到的数值和原值一致,只是巧合,并不是unsigned特性未生效。unsigned的特性主要体现在运算溢出规则、符号扩展逻辑上,在这个刚好不涉及最高位为1的场景下,不会体现出差异。
正确使用方式

要正确输出unsigned long类型的变量,必须使用匹配的%lu格式说明符,示例代码如下:

#include <stdio.h>

// 注意:C标准中main函数的标准返回值为int,void main属于非标准写法,仅在部分编译器下兼容
int main()
{
    unsigned long nou = 2200000000UL;
    printf("the number is %lu", nou);
    return 0;
}

建议编译时开启编译器警告(比如GCC加-Wall参数),会直接提示你格式说明符和参数类型不匹配的问题,提前规避这类错误。

内容的提问来源于stack exchange,提问作者Mister-3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 02:06:03