int和long可以是同一类型吗?

时间:2013-02-14 12:10:09

标签: c

当然intlong不是保证是相同的类型,但是在Windows等平台上进行32位模式编译时是相同的大小,编译器允许将它们视为相同的类型?

我不确定如何明确地测试编译器是否将两种类型视为相同,但我尝试使用int *a; long *b = a;进行启发式测试,并且Microsoft编译器接受此而没有投诉,而GCC发出警告。是编译器行为不正确还是依赖于实现,无论它们是两个不同的类型还是只有一个?

2 个答案:

答案 0 :(得分:5)

标准(C2011标准的N1570草案)在6.2.5(4)中说明:

  

有五种标准的有符号整数类型,指定为signed charshort intintlong intlong long int。 (这些和其他类型可以用几种其他方式指定,如6.7.2中所述。)也可能存在实现定义的扩展有符号整数类型。标准和扩展有符号整数类型统称为有符号整数类型。

并在同一部分的第14段中:

  

类型char,有符号和无符号整数类型以及浮点类型   统称为基本类型。基本类型是完整的对象类型。即使是   实现定义了两个或多个具有相同表示的基本类型,它们是   不过不同的类型。

所以说intlong(指定long int的另一种方式)是不同的类型。它们可能具有相同的表示,行为和对齐要求,但就语言而言,它们的类型不同。

答案 1 :(得分:3)

好的,C99标准在 6.5.6类型

部分中说明
  

有五种标准有符号整数类型,指定为已签名   char short int int long int long long int 。   (这些和其他类型可以用其他几种方式指定,   如6.7.2中所述。)也可能有实现定义   扩展的有符号整数类型。标准和扩展有符号整数类型统称为有符号整数类型

而且:

  

类型 char ,有符号和无符号整数类型,以及   浮动类型统称为基本类型。即使是   实现定义两个或多个基本类型具有相同的   表示,他们是不同的类型。

很明显,他们必须是不同的类型,即使在C中,没有模板,函数重载和typeid它可能不是那么重要与 C ++ 一样,那些类型为相同的类型肯定会破坏很多代码。

编辑:事实上由于 C 中类型清晰度的这种较小的实际相关性以及缺少上述语言功能,我无法想出一种可靠的方式立即测试两种类型的绝对清晰度。