什么是整型文字类型?以及它们是如何存储的?

2 c signed constants unsigned-integer

我刚刚开始学习 C,一个问题困扰了我一段时间。如果我写

int i = -1;
unsigned int j = 2;
unsigned int k = -2;
Run Code Online (Sandbox Code Playgroud)

整数文字-1and 2and的类型是什么-2,它如何转换为存储在signed intand 中unsigned int

有符号整数是什么意思,是变量还是整数文字的属性?比如-2有符号整数和2无符号整数?

Kei*_*son 6

首先,-1不是整数常量。它是一个由-应用于常量的一元运算符组成的表达式1

在C99和C11,十进制整数常量的类型是第一的intlong intlong long int在其值将适合。类似地,八进制或十六进制文字具有类型int, unsigned int, long int, unsigned long int, long long int, 或unsigned long long int。详细信息在N1570 6.4.4.1 中。

-1-2常量表达式。一元运算-符的结果与操作数具有相同的类型(即使该结果导致溢出,-INT_MIN在大多数实现中也是如此)。

int i = -1;
Run Code Online (Sandbox Code Playgroud)

常量1和表达式-1都是类型int。该值存储在int对象中i;不需要转换。(严格来说,它是从 转换int为 的int,但这无关紧要。)

unsigned int j = 2;
Run Code Online (Sandbox Code Playgroud)

2是 类型int。它从 转换intunsigned int

unsigned int k = -2;
Run Code Online (Sandbox Code Playgroud)

-2是 类型int。它从 转换intunsigned int。这一次,因为-2在 的范围之外unsigned int,转换是非平凡的;结果是UINT_MAX - 1

一些术语:

一个常量就是一些其他语言调用文字。它是代表一个常量值的单个标记。例子是10xff

常量表达式是的需要的编译时要被评估的表达式。常量是一个常量表达式;操作数为常量或常量表达式的表达式也是如此。例子是-12+2

  • 每个表达式都有一个类型。 (2认同)
  • @user7359847 几年后:不存在矛盾。“1”是“int”类型的十进制整数常量。这也是一种表达。`-1` 不是十进制整数常量,但它是一个表达式,并且它也有类型 `int`。它的类型不是由十进制整数常量的规则确定的,而是由一元“-”运算符的规则确定的。“一元 **`-`** 运算符的结果是其(提升的)操作数的负数。对操作数执行整数提升,结果具有提升的类型。” (2认同)