gpt4 book ai didi

c - 如果 "long"和 "int"在平台上的大小相同 - "long"和 "int"有什么不同吗?

转载 作者:行者123 更新时间:2023-12-04 04:26:55 25 4
gpt4 key购买 nike

如果表示 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,如果它们碰巧是相同的表示。
在讨论如何定义 int32_t 时出现了这个问题。 - 类似于没有 stdint.h 的嵌入式 C89 编译器的 typedef,即 intlong如果这很重要。

最佳答案

它们不是兼容的类型,您可以通过一个简单的示例看到:

int* iptr;
long* lptr = iptr; // compiler error here
所以在处理指向这些类型的指针时最重要。同样,有“严格别名规则”使此代码行为未定义:
int i;
long* lptr = (long*)&i;
*lptr = ...; // undefined behavior
另一个微妙的问题是隐式提升。如果您有 some_int + some_long那么该表达式的结果类型是 long .或者,如果任一参数是无符号的, unsigned long .这是因为通过通常的算术转换进行整数提升,参见 Implicit type promotion rules .
大多数情况下应该无关紧要,但是这样的代码会失败: _Generic(some_int + some_long, int: stuff() )因为没有 long表达式中的子句。
通常,在类型之间分配值时,应该没有任何问题。如果是 uint32_t ,对应哪个类型无所谓,因为你应该对待 uint32_t无论如何作为一个单独的类型。我会选择 long与小型微 Controller 兼容,其中 typedef unsigned int uint32_t;会打破。 (很明显, typedef signed long int32_t; 代表已签名的等价物。)

关于c - 如果 "long"和 "int"在平台上的大小相同 - "long"和 "int"有什么不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66850401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com