当前位置: 首页 > 知识库问答 >
问题:

如果在一个平台上“long”和“int”的大小相同--“long”和“int”有什么不同吗?

公孙巴英
2023-03-14

如果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.h的嵌入式C89编译器定义类似int32_t的typedef(即intlong)以及这是否重要时,出现了这个问题。

共有2个答案

高嘉熙
2023-03-14

类型longint具有不同的级别。类型long的秩高于类型int的秩。因此,在使用long类型的对象和int类型的对象的二进制表达式中,最后一个总是转换为long类型。

比较以下代码段。

int x = 0;
unsigned int y = 0;

表达式x+y的类型是unsigned int

long x = 0;
unsigned int y = 0;

表达式x+y的类型是unsigned long(由于通常的算术转换),前提是sizeof(int)等于sizeof(long)

这在C++中比在C中非常重要,因为C允许函数重载。

在C语言中,您必须考虑到这一点,例如,当您使用I/O函数时,例如printf来指定正确的转换说明符。

巩阳秋
2023-03-14

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

int* iptr;
long* lptr = iptr; // compiler error here

因此在处理指向这些类型的指针时,它非常重要。类似的,还有“严格的别名规则”,使得这段代码成为未定义的行为:

int i;
long* lptr = (long*)&i;
*lptr = ...;  // undefined behavior

另一个微妙的问题是隐性提升。如果您有some_int+some_long,则该表达式的结果类型为long。或者在任一参数为无符号的情况下,使用unsigned long。这是因为通过通常的算术转换进行整数提升,请参阅隐式类型提升规则。大多数情况下不应该很重要,但是这样的代码会失败:_generic(some_int+some_long,int:stuff()),因为表达式中没有long子句。

通常,在类型之间赋值时,应该不会有任何问题。在uint32_t的情况下,它对应于哪种类型并不重要,因为无论如何您都应该将uint32_t作为单独的类型对待。我会选择long,以便与小型微控制器兼容,其中typedef unsigned int uint32_t;会中断。(很明显,typedef带符号的long int32_t;表示带符号的等价物。)

 类似资料:
  • 我正在从Java过渡到C,对<code>long</code>数据类型有一些疑问。在Java中,要保存大于2的整数<sup>32<sup>,只需编写<code>长x 。然而,在C语言中,<code>long</code>似乎既是数据类型又是修饰符。 似乎有几种方法可以使用: 还有,好像还有这样的事情: 等等 所有这些不同的数据类型之间有什么区别,它们都有相同的目的吗?

  • 描述 (Description) C库函数long int labs(long int x)返回long int labs(long int x)的绝对值。 声明 (Declaration) 以下是labs()函数的声明。 long int labs(long int x) 参数 (Parameters) x - 这是整数值。 返回值 (Return Value) 此函数返回x的绝对值。 例子

  • 问题内容: 有时我看到API正在使用或或或,但我不知道如何做出决定? 我什么时候应该选择什么? 问题答案: 是的形式,是的对象形式。 在采用64位。在使用32位,所以只能容纳人数达到±2十亿(-2 31到2 31 -1)。 您应该使用和,除非需要使用从继承的方法,例如。方法通常使用带框(-wrapped)版本,因为它们需要适用于任何版本,并且基本类型(例如或)不是。 另一个区别是,and 是 按值

  • 本文向大家介绍Python3和Python2中int和long区别相关面试题,主要包含被问及Python3和Python2中int和long区别时的应答技巧和注意事项,需要的朋友参考一下 在python3里,只有一种整数类型int,大多数情况下,和python2中的长整型类似。  

  • 描述 (Description) C库函数int fseek(FILE *stream, long int offset, int whence)将stream的文件位置设置为给定的offset 。 声明 (Declaration) 以下是fseek()函数的声明。 int fseek(FILE *stream, long int offset, int whence) 参数 (Paramete

  • 我在Surface Pro 2平板电脑上运行Windows8.1x64和Java7更新45x64(没有安装32位Java)。 下面的代码在i类型为long时占用1688ms,在i类型为int时占用109ms。为什么在64位JVM的64位平台上,long(64位类型)比int慢一个数量级? 我唯一的猜测是,CPU加一个64位整数比加一个32位整数需要更长的时间,但这似乎不太可能。我怀疑Haswell