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

如何确认Linux GCC下unsigned long的取值范围及验证正确性?

验证Linux GCC下unsigned long与unsigned long long的取值范围

咱们来一步步捋清楚你这个问题哈~你观察到在自己的Linux GCC环境里unsigned long和unsigned long long都占8字节,进而推测它们的取值范围都是0到2^64 - 1,这个思路没问题,但咱们得通过代码验证来实锤结论。

补全后的验证代码

你给出的代码没写完,我帮你补全成可运行的完整版本:

#include <stdio.h>

int main(void) {
    // 用%zu适配size_t类型,避免编译警告
    printf("unsigned long takes up %zu bytes:\n", sizeof(unsigned long));
    printf("unsigned long long takes up %zu bytes:\n", sizeof(unsigned long long));
    
    // 加ULL后缀,明确是无符号长整型字面量,避免溢出警告
    unsigned long a = 18446744073709551615ULL;
    a++;
    printf("a + 1 = %lu\n", a);
    
    unsigned long long b = 18446744073709551615ULL;
    b++;
    printf("b + 1 = %llu\n", b);
    
    return 0;
}

验证逻辑说明

  • 用sizeof确认字节数:如果输出都是8,说明两者都是64位存储空间;
  • 赋值2^64 - 1(即18446744073709551615)后自增:无符号整数溢出会触发**模2N**的规则,自增后会变回0,这就证明它们的最大值确实是264 - 1,最小值自然是0。

Linux GCC环境下的运行结果

编译运行后,你会看到类似这样的输出:

unsigned long takes up 8 bytes:
unsigned long long takes up 8 bytes:
a + 1 = 0
b + 1 = 0

这就实锤了你的结论:在这个环境下,unsigned long和unsigned long long的取值范围确实是0到2^64 - 1。

不过要注意:这个结果是Linux GCC特有的,不同平台(比如Windows下的MSVC)可能不一样——比如Windows里unsigned long通常是4字节,取值范围就小很多啦。

内容的提问来源于stack exchange,提问作者Sleeping On a Giant's Shoulder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:36:05