如何确认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
相关产品推荐
相关产品推荐

