我做了这个程序来测试什么数据类型的任意整型文字得到评估。这个程序是从阅读有关stackoverflow的其他一些问题中得到启发的。
How do I define a constant equal to -2147483648?
Why do we define INT_MIN as -INT_MAX - 1?
(-2147483648> 0) returns true in C++?
在这些问题中,我们有一个问题:程序员想把int-min写成
-
2 ^ 31
但是
2 ^ 31
实际上是字面意思
-
是一元求反运算符。因为int_max通常
2^31-1个
有32位int的
2 ^ 31
不能表示为
int
,因此它被提升为更大的数据类型。第三个问题的第二个答案有一个图表,根据该图表可以确定整型文字的数据类型。编译器从顶部向下搜索列表,直到找到适合文本的数据类型。
Suffix Decimal constants
none int
long int
long long int
======================================================
在我的小程序中,我定义了一个宏,它将以C字符串的形式返回变量、文本或表达式的“名称”。基本上,它返回在宏内部传递的文本,正如您在代码编辑器中看到的那样。我用它来打印文本表达式。
我想确定表达式的数据类型,它的计算结果。我必须对我怎么做有点聪明。如何在C语言中确定变量或表达式的数据类型?我得出的结论是,只有两个“位”的信息是必要的:以字节为单位的数据类型的宽度和数据类型的签名性。
我使用
sizeof()
以字节为单位确定数据类型宽度的运算符。我还使用另一个宏来确定数据类型是否有符号。
typeof()
是返回
数据类型
变量或表达式的。但我不能
阅读
数据类型。我打字
-1
无论数据类型是什么。如果它是签名数据类型,它仍然是
- 1
,如果它是无符号数据类型,它将成为
UINT_MAX
对于该数据类型。
#include <stdio.h> /* C standard input/output - for printf() */
#include <stdlib.h> /* C standard library - for EXIT_SUCCESS */
/**
* Returns the name of the variable or expression passed in as a string.
*/
#define NAME(x) #x
/**
* Returns 1 if the passed in expression is a signed type.
* -1 is cast to the type of the expression.
* If it is signed, -1 < 0 == 1 (TRUE)
* If it is unsigned, UMax < 0 == 0 (FALSE)
*/
#define IS_SIGNED_TYPE(x) ((typeof(x))-1 < 0)
int main(void)
{
/* What data type is the literal -9223372036854775808? */
printf("The literal is %s\n", NAME(-9223372036854775808));
printf("The literal takes up %u bytes\n", sizeof(-9223372036854775808));
if (IS_SIGNED_TYPE(-9223372036854775808))
printf("The literal is of a signed type.\n");
else
printf("The literal is of an unsigned type.\n");
return EXIT_SUCCESS;
}
如你所见,我正在测试
-
2 ^ 63
查看它是什么数据类型。问题是,在iso c90中,整数文本的“最大”数据类型似乎是
long long int
如果我们能相信图表。众所周知,
双长整型
具有数值范围
- 2 ^ 63
到
2^63-1个
在现代64位系统上。但是,
-
上面是一元求反运算符,不是整型文字的一部分。我正在尝试确定
2 ^ 63
太大了
双长整型
. 我正试图在C的类型系统中引起一个错误。这是故意的,而且只是为了教育目的。
我正在编译和运行这个程序。我用
-std=gnu99
而不是
-std=c99
因为我在用
类型(共)
是GNU编译器扩展,实际上不是ISO C99标准的一部分。我得到以下输出:
$ gcc -m64 -std=gnu99 -pedantic experiment.c
$
$ ./a.out
The literal is -9223372036854775808
The literal takes up 16 bytes
The literal is of a signed type.
我看到整型文字等于
2 ^ 63
计算为16字节有符号整数类型!据我所知,在C编程语言中没有这样的数据类型。我也不知道任何一个Intelx86_64处理器有一个16字节的寄存器来存储这样一个值。如果我错了请纠正我。解释这里发生了什么?为什么没有溢出?此外,是否可以在C中定义16字节的数据类型?你会怎么做?