gpt4 book ai didi

c - 奇怪的编译行为

转载 作者:行者123 更新时间:2023-12-02 10:41:11 25 4
gpt4 key购买 nike

我想在高级中说,我无法通过几行代码来重现我要解释的问题(相信我,我尝试过)。而且,我已经解决了下面描述的问题。我只是想确定原因。

我正在为C编写一个terminal code editor。在另一种体系结构(具体来说是Arm)上对其进行测试后,我遇到了一个奇怪的错误-它不再向上滚动(向下滚动)。我在main的这段代码中将问题缩小到此函数调用:

} else if ((c + 64) == 'V'){
edit_scroll (&session, session.max_y / 2);
session.cursor = session.disp;
session.flags |= EDIT_FLAG_REPRINT;
} else if ((c + 64) == 'Y'){
//here
edit_scroll (&session, -1 * (session.max_y / 2)); /*
| |
Removing parenthesis causes compilation errors
in some platforms.
*/
session.cursor = session.disp;
session.flags |= EDIT_FLAG_REPRINT;
}

传递负值时, edit_scroll将向上滚动(如图所示)。当我添加这两个括号时,我修复了该错误,并且发现该表达式正在函数调用中评估为 2147483598。请注意,当我运行此测试时,此编译中的 int的最大值为 2,147,483,647,而 session.max_y的大小为 100(该变量表示终端高度)。

这是 edit_scroll的实现:
int edit_scroll (struct edit * session, int deltay){
// I printed deltay at this line, when I determined the value
int i = session->disp;
char * data = session->buffer.data;

if (deltay > 0){
for (; data[i] && deltay; i++){
if (data[i] == '\n'){
deltay--;
}
}

if (!deltay){
session->disp = i;
}

}

if ((deltay < 0) && (session->disp > 0)){
for (i--; i > 0; i--){
if (data[i - 1] == '\n'){
if (!(++deltay)){
break;
}
}
}
session->disp = i;
}

return 0;
}

就像我说的那样,我无法在小型测试程序中重现此错误。我已经用Clang和Gcc尝试过,它们都给出相同的错误。为什么这会得出奇数?可以肯定地说这是编译错误吗?
-1 * session.max_y / 2

显示装配会有所帮助吗?我应该发布更多源代码吗?我很犹豫要发布整个代码,因为仅 .c文件就比 1800行多一点。

最佳答案

乘法和除法是左联想的。因此,如果删除括号,则将计算(-1 * session.max_y) / 2而不是-1 * (session.max_y / 2)。如果该max_y字段是无符号的,则该除法将在一种情况下进行符号扩展,而在另一种情况下则不会,从而产生不同的结果。

关于c - 奇怪的编译行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17961029/

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