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
长的?
我知道一个事实,即存在 有 许多 密切 相关的关于这个问题的问题,但我觉得在这些问题的答案没有给我提供什么将会或可能在这个过程中发生了全面的了解.
基本上我想弄清楚以下内容:
long
给int
转让之前,或long
不是一个不同的数据类型,而只是一个修饰符,long > int
?结果是不确定的(或不可预测的)还是会导致变量的额外部分被省略?long
,以int
在C工作?long
到int
使用C作品时,我不使用铸造?Kei*_*son 45
语言保证int
至少为16位,long
至少为32位,并且至少long
可以表示可以表示的所有值int
.
如果long
为int
对象赋值,则会隐式转换它.没有必要进行明确的演员表演; 它只会指定将要发生的相同转换.
在您的系统上,在何处int
以及long
恰好具有相同的大小和范围,转换是微不足道的; 它只是复制价值.
在long
宽度大于的系统上int
,如果值不适合a int
,则转换的结果是实现定义的.(或者,从C99开始,它可以引发实现定义的信号,但我不知道任何编译器实际上是这样做的.)通常发生的是高位比特被丢弃,但你不应该依赖在那.(对于无符号类型,规则是不同的;将有符号或无符号整数转换为无符号类型的结果已经明确定义.)
如果需要安全地long
为int
对象赋值,可以在执行赋值之前检查它是否合适:
#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)
"别的东西"的细节将取决于你想做什么.
一个修正:int
和long
是总是不同的类型,即使它们碰巧具有相同的大小和代表性.算术类型可以自由转换,因此这通常没有任何区别,但是例如int*
并且long*
是不同且不兼容的类型; 你无法分配long*
到int*
,反之亦然,没有一个明确的(和潜在的危险)铸.
如果您发现自己需要将long
值转换为int
,那么您应该做的第一件事就是重新考虑代码的设计.有时这种转换是必要的,但更常见的是,它们表明int
您所分配的内容应该首先被定义为a long
.
归档时间: |
|
查看次数: |
61924 次 |
最近记录: |