当我在C中将long int分配给int时会发生什么?

Kha*_*mes 57 c integer casting variable-assignment long-integer

在最近的家庭作业中,我被告知使用long变量来存储结果,因为它可能是一个很大的数字.

我决定检查它对我来说真的很重要,在我的系统上(intel core i5/64-bit windows 7/gnu gcc编译器)并发现以下代码:

printf("sizeof(char) => %d\n", sizeof(char));
printf("sizeof(short) => %d\n", sizeof(short));
printf("sizeof(short int) => %d\n", sizeof(short int));
printf("sizeof(int) => %d\n", sizeof(int));
printf("sizeof(long) => %d\n", sizeof(long));
printf("sizeof(long int) => %d\n", sizeof(long int));
printf("sizeof(long long) => %d\n", sizeof(long long));
printf("sizeof(long long int) => %d\n", sizeof(long long int));
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

sizeof(char) => 1
sizeof(short) => 2
sizeof(short int) => 2
sizeof(int) => 4
sizeof(long) => 4
sizeof(long int) => 4
sizeof(long long) => 8
sizeof(long long int) => 8
Run Code Online (Sandbox Code Playgroud)

换句话说,在我的系统上,int并且long是相同的,并且任何太大而int无法容纳的东西,都太大了,long无法容纳.

家庭作业本身不是问题.我想知道,在一个系统中int < long,我应该如何分配一个int长的?

我知道一个事实,即存在 许多 密切 相关的关于这个问题的问题,但我觉得在这些问题的答案没有给我提供什么将会或可能在这个过程中发生了全面的了解.

基本上我想弄清楚以下内容:

  1. 我应该投longint转让之前,或因为long 不是一个不同的数据类型,而只是一个修饰符, 直接分配会被视为无害吗?
  2. 系统会发生什么long > int?结果是不确定的(或不可预测的)还是会导致变量的额外部分被省略?
  3. 如何铸造的long,以int在C工作?
  4. 如何从分配longint使用C作品时,我不使用铸造?

Kei*_*son 45

语言保证int至少为16位,long至少为32位,并且至少long可以表示可以表示所有值int.

如果longint对象赋值,则会隐式转换它.没有必要进行明确的演员表演; 它只会指定将要发生的相同转换.

在您的系统上,在何处int以及long恰好具有相同的大小和范围,转换是微不足道的; 它只是复制价值.

long宽度大于的系统上int,如果值不适合a int,则转换的结果是实现定义的.(或者,从C99开始,它可以引发实现定义的信号,但我不知道任何编译器实际上是这样做的.)通常发生的是高位比特被丢弃,但你不应该依赖在那.(对于无符号类型,规则是不同的;将有符号或无符号整数转换为无符号类型的结果已经明确定义.)

如果需要安全地longint对象赋值,可以在执行赋值之前检查它是否合适:

#include <limits.h> /* for INT_MIN, INT_MAX */

/* ... */

int i;
long li = /* whatever */

if (li >= INT_MIN && li <= INT_MAX) {
    i = li;
}
else {
    /* do something else? */
}
Run Code Online (Sandbox Code Playgroud)

"别的东西"的细节将取决于你想做什么.

一个修正:intlong总是不同的类型,即使它们碰巧具有相同的大小和代表性.算术类型可以自由转换,因此这通常没有任何区别,但是例如int*并且long*是不同且不兼容的类型; 你无法分配long*int*,反之亦然,没有一个明确的(和潜在的危险)铸.

如果您发现自己需要将long值转换为int,那么您应该做的第一件事就是重新考虑代码的设计.有时这种转换是必要的,但更常见的是,它们表明int您所分配的内容应该首先被定义为a long.