如果long intint在平台上的表示是相同的,那么它们是否完全相同?根据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的情况下为嵌入式C89编译器定义类似于int32_t的typedef时,出现了一个问题.h、 即as 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.这是因为整型提升到the usual arithmetic conversions,参见Implicit type promotion rules.

一般来说,在类型之间赋值时,应该不会有任何问题.对于uint32_t,它对应的类型无关紧要,因为无论如何,你都应该将uint32_t视为一个单独的类型.我会 Select long作为与小型微控制器的兼容性,而typedef unsigned int uint32_t;会出现故障.(显然,签名的类似功能为typedef signed long int32_t;.)

C++相关问答推荐

为什么已经设置的值在C中被重置为for循环条件中的新值?

为什么下面的递归基本情况在C中不起作用?

va_copy的使用是未定义的行为吗?

GCC引发不明确的诊断消息

显式地将值转换为它从函数返回的类型的含义是什么?

LibpCap禁用监视器模式(C、MacOS)

使用C时,Windows CMD中的argc参数是否包含重定向命令?

进程已完成,退出代码为138 Clion

如何使用指向 struct 数组的指针并访问数组中特定索引处的 struct

每次除以或乘以整数都会得到0.0000

为什么我可以在GCC的标签后声明变量,但不能声明Clang?

tick.q中的Kdb+键控表语法

Realloc():中止的下一个大小无效(核心转储)

在C中使用无符号整数模拟有符号整数

如何在不更改格式说明符的情况下同时支持双精度和长双精度?

程序如何解释变量中的值

添加/删除链表中的第一个元素

子进程不会修改父进程中的统计信息

我该如何处理这个 C 90 代码中的内存泄漏?

如何让 unlinkat(dir_fd, ".", AT_REMOVEDIR) 工作?