long long vs int multiplication
给出以下代码段:
#include <stdio.h>
typedef signed long long int64;
typedef signed int int32;
typedef signed char int8;
int main()
{
printf("%in", sizeof(int8));
printf("%in", sizeof(int32));
printf("%in", sizeof(int64));
int8 a = 100;
int8 b = 100;
int32 c = a * b;
printf("%in", c);
int32 d = 1000000000;
int32 e = 1000000000;
int64 f = d * e;
printf("%I64dn", f);
}
MinGW GCC 3.4.5的输出为(-O0):
1
4
8
10000
-1486618624
第一个乘法在内部转换为int32(根据汇编器输出)。第二次乘法不是铸造的。我不确定结果是否不同,因为程序在IA32上运行,或者因为它是在C标准的某处定义的。然而,我感兴趣的是,这个确切的行为是在某处定义的(ISO / IEC 9899?),因为我想更好地理解为什么以及何时我需要手动编译(我有问题从不同的架构移植程序)。
没有找到相关结果
已邀请:
4 个回复
谷起
之类的二元运算符不能在小于
的整数类型上运行。在应用运算符之前,这些类型的表达式被提升为
。见6.3.1.4第2段和多次出现的“整数提升”。但这与编译器生成的汇编指令有些正交,后者在
s上运行,因为即使允许编译器计算更短的结果,这也会更快(因为结果立即存储在short类型的l值中) , 例如)。 关于
其中
和
属于
类型,乘法按照相同的促销规则以
完成。溢出在技术上是未定义的行为,你在这里得到二进制补码结果,但你可以根据标准得到任何东西。 注意:促销规则区分已签名和未签名类型。规则是将较小的类型推广到
,除非
不能代表该类型的所有值,在这种情况下使用
。
担每棱绰
相同的效果,它会使用整数除法将3除以2,并将1.0分配给
。 只要它可能很重要,您就必须注意表达式或子表达式的类型。这需要确保将适当的操作计算为适当的类型,例如将其中一个被乘数转换为int64,或者(在我的示例中)
或
。
嘘崇蔡对
计算为int,然后转换为接收变量类型(恰好是int)
计算为int,然后转换为接收变量类型(恰好是int64) 如果任何一个类型变量都大于int(或浮点数),那么将使用该类型。但由于乘法中使用的所有类型都是int或更小,因此使用了int。
砷竣阿