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

标签 c types integer representation

如果表示 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/

相关文章:

c - "&(epage->incoming[0]) = spage;"和 "&(epage->incoming[p2]) = spage;"之间的区别

CUDA - 多次调用内核

c# - mvc razor View 中的整数扩展

javascript - 当我给他一个负数和一个正数时,为什么我的 JS 随机整数生成器如此错误?

c - 打印 printf() 函数的地址以及代码的 pmap...printf() 的地址显示为代码段的一部分而不是 libc

c - STM32 I2C1 起始位未在 SR1 寄存器上设置

python - 从抽象类继承时如何避免重复参数定义?

oop - 为什么 Dart 更喜欢省略局部变量的类型注释?

c++ - 如何验证类方法签名?

c++ - 将 float 与整数进行比较的符合标准的方法?