C语言合法整型常数有哪些?

99ANYc3cd6
预计阅读时长 11 分钟
位置: 首页 C语言 正文

整型常数是直接写在代码中的整数,如 10, -50, 0 等,C语言为了满足不同场景的需求,允许使用多种形式来表示整型常数。

在c语言中 合法的整型常数是
(图片来源网络,侵删)

合法的整型常数主要可以分为以下几类:


十进制整数

这是我们最熟悉的形式,由数字 0-9 组成,可以带有正负号。

规则:

  • 由数字序列组成。
  • 可以以可选的 或 符号开头。
  • 不能有前导零(除非是数字 0 本身)。

合法示例:

在c语言中 合法的整型常数是
(图片来源网络,侵删)
  • 123
  • -456
  • +789
  • 0 (表示零)

非法示例:

  • 0123 (在C89/C90标准中,这会被当作八进制数,但在C99及以后的标准中,这是非法的,会产生编译警告或错误。)
  • 3 (这是浮点数,不是整数)
  • 1_000 (除非使用C23的数字分隔符,否则下划线是非法的)

八进制整数

八进制整数用于表示以8为基数的数。

规则:

  • 必须以数字 0 开头。
  • 后面跟数字 0-7

合法示例:

  • 0123 (表示十进制的 1*8² + 2*8¹ + 3*8⁰ = 64 + 16 + 3 = 83)
  • 0777 (表示十进制的 511)
  • 0 (也是合法的八进制表示)

非法示例:

  • 123 (没有前导0,是十进制)
  • 0189 (包含了数字 89,它们在八进制中是非法的)

十六进制整数

十六进制整数用于表示以16为基数的数,在编程中非常常用,尤其是在处理内存地址、颜色值等场景。

规则:

  • 必须以 0x0X 开头。
  • 后面跟数字 0-9 和字母 a-fA-F

合法示例:

  • 0x1A (表示十进制的 1*16¹ + 10*16⁰ = 16 + 10 = 26)
  • 0XFF (表示十进制的 255)
  • 0x7fffffff (在32位系统上,常用来表示 int 类型的最大正整数)

非法示例:

  • 1A (缺少 0x 前缀)
  • 0xGH (包含了非法字符 GH)

二进制整数 (C11及以后标准)

从C11标准开始,C语言原生支持了二进制整数的表示,这使得处理位操作更加直观。

规则:

  • 必须以 0b0B 开头。
  • 后面跟数字 01

合法示例:

  • 0b1010 (表示十进制的 10)
  • 0B110011 (表示十进制的 51)
  • 0b1 (表示十进制的 1)

注意: 一些老旧的编译器可能不完全支持C11标准,因此二进制字面量可能不被支持或需要编译器特定的扩展。


后缀:指定整型类型

整型常数本身有默认类型,10 的默认类型是 int,但我们可以通过添加后缀来显式地指定其类型,这对于避免溢出和确保类型一致性非常重要。

后缀可以是大写或小写。

后缀 含义 示例
uU 无符号 10U, 0xFFu
lL 长整型 1000L, 0123L
llLL 长长整型 10000000000LL
uluL 无符号长整型 10UL
ulluLL 无符号长长整型 10000000000ULL

组合使用: 后缀可以组合,顺序通常不重要。

  • luul 都表示 unsigned long
  • lluull 都表示 unsigned long long

示例:

  • 123456789 // 默认为 int
  • 1234567890L // long
  • 123456789012345LL // long long (这个数字太大了,无法用 intlong 存储)
  • 4000000000U // unsigned int (在32位 int 系统上,4000000000会超出 int 范围,但可以存入 unsigned int)
  • 40000000000ULL // unsigned long long

总结表格

类型 前缀 示例 默认类型
十进制 123, -456, +789 int
八进制 0 0123, 0777 int
十六进制 0x0X 0x1A, 0XFF int
二进制 0b0B 0b1010, 0B1100 int (C11+)
无符号 uU 123U unsigned int
长整型 lL 123L long
长长整型 llLL 123LL long long
无符号长长整型 ulluLL 123ULL unsigned long long

综合示例

#include <stdio.h>
int main() {
    // 十进制
    int a = 123;
    // 八进制
    int b = 0123; // 十进制值为 83
    // 十六进制
    int c = 0x1A; // 十进制值为 26
    // 二进制 (C11标准)
    int d = 0b1010; // 十进制值为 10
    // 带后缀
    long e = 2147483648L; // 超过int最大值,用long存储
    unsigned int f = 4294967295U; // unsigned int的最大值
    // 打印结果
    printf("a (dec) = %d\n", a);
    printf("b (oct) = %d (dec) or %o (oct)\n", b, b);
    printf("c (hex) = %d (dec) or %x (hex)\n", c, c);
    printf("d (bin) = %d (dec)\n", d);
    printf("e (long) = %ld\n", e);
    printf("f (unsigned int) = %u\n", f);
    return 0;
}

重要提示:

  • 整型常数的类型会影响它在表达式中的计算方式和取值范围。3000000000 在32位 int 系统上会发生溢出,但 3000000000U3000000000LL 则是合法的。
  • 在编写代码时,选择合适的进制和后缀是写出健壮、可读代码的重要一环,使用十六进制表示位掩码,使用 ULL 确保大数计算不溢出。
-- 展开阅读全文 --
头像
dede如何防止网站被采集
« 上一篇 02-09
c语言10进制转16进制函数
下一篇 » 02-09

相关文章

取消
微信二维码
支付宝二维码

目录[+]