【发布时间】:2021-06-25 06:10:53
【问题描述】:
如果long int 和int 在平台上的表示相同,它们是否严格相同?根据 C 标准,这些类型在平台上的行为是否有任何不同?
例如。这总是有效吗:
int int_var;
long long_var;
void long_bar(long *l);
void int_bar(int *i);
void foo()
{
long_bar(&int_var); /* Always OK? */
int_bar(&long_var);
}
我想同样的问题也适用于 short 和 int,如果它们恰好是相同的表示。
在讨论如何为没有 stdint.h 的嵌入式 C89 编译器定义类似 int32_t 的 typedef 时出现了问题,即作为 int 或 long 以及是否重要。
【问题讨论】:
-
不同的类型是不同的,即使它们的按位表示是相同的。你在做什么打破了严格的别名。
-
即使它们的大小相同,它们仍可能具有不同的范围,因为 C 允许类型具有陷阱表示和填充位。例如
int可以将 0x80000000 作为陷阱,但long可以正常存储它。或者int可以有 2 个填充位,但long只有 1 个 -
另一个例子是
char、signed char、unsigned char是 3 种不同的类型,它们的大小相同,但它们的范围也不同于_Bool,_Bool是另一种通常具有相同大小的类型 -
使用 GCC,您可以编写自己的 GCC 插件来更改其行为。 GCC 和 Clang 都是开源编译器,你可以改进
标签: c types integer representation