gpt4 book ai didi

c - 在 C 部分 2 中将 char 和 int 相乘

转载 作者:太空宇宙 更新时间:2023-11-04 06:44:35 27 4
gpt4 key购买 nike

如果我执行以下操作:

int c0 = CHAR_MAX; //8 bit
int c1 = CHAR_MAX; //8-bit
int i = c0*c1; //store in 32-bit variable
printf("%d\n", i); //prints 16129

我们可以看到将 8 位数字相乘并产生 32 位输出没有问题。

但是,如果我这样做

int i0 = INT_MAX; //32-bit
int i1 = INT_MAX; //32 bit variable
long long int ll = i0*i1; //store in 64-bit variable
printf("%lld\n", ll); //prints 1..overflow!!

在这种情况下,两个 32 位变量相乘,溢出,然后赋值给 64 位变量。

那么为什么在乘以整数而不是字符时会发生溢出?它取决于我机器的默认字长吗? (32 位)

最佳答案

你应该改变你的第二个代码示例

int i0 = INT_MAX; //32-bit
int i1 = INT_MAX; //32 bit variable
long long ll = ((long long)i0)*i1; //compute and store in 64-bit variable
printf("%lld\n", ll);

也就是说,在乘以它们之前将整数(至少其中一个)转换为 64 位。否则会发生溢出,因为在将结果分配给 long long 变量之前尝试将结果存储在 int 类型的临时文件中。任何表达式的结果都以最高精度转换为其成员的精度。

在第一个示例中,int 足够大以容纳乘以 char 的结果,因此没有溢出。

附带说明一下,不建议将变量命名为 ll,因为很难区分数字“1”和小写字母“l”。

关于c - 在 C 部分 2 中将 char 和 int 相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2666841/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com