gpt4 book ai didi

c - 在 C 中赋值之前如何存储表达式值?

转载 作者:行者123 更新时间:2023-12-02 16:34:40 26 4
gpt4 key购买 nike

初学者问题在这里;在 C 语言中,当您将数值赋给变量时,语言明确表示该变量具有特定类型,该类型只能包含特定范围的数值。如果分配给变量的值超出其类型定义的范围,它将溢出。示例;

char foo = 1000;

此处 foo 不应等于 1000。我想赋值涉及将表达式的值转换为变量类型,因此,赋值可能会修改表达式的值,具体取决于是否溢出与否取决于变量类型和表达式的值。在更复杂的情况下(不是硬编码的值),我认为在分配实际发生之前不知道将存储在内存中的值。

我的问题是;在代码执行期间,表达式的值在赋值之前如何存储?

事实上,它们必须写在一定数量的位上,这在浮点值的情况下给了它们一个最小值、一个最大值和一个精度最大值。

作为这个问题的应用;是否可以编写一个涉及硬编码数字的表达式,该数字太大以至于在执行期间实际上无法正确存储?设想一个硬编码表达式涉及一个比最大可能值稍大的数字除以二,这样表达式理论上会产生一个可表示的数字,但事实并非如此。

最佳答案

My question is; during code execution, how are the values of expressions stored before they are assigned?

通常,它们在代码中存储为常量,如下所示:

movb   $-0x18, -0x11(%rbp)

-0x18 是存储在某个内存位置的常量 -24。

I suppose assignment involves the expression's value to be casted to the variable type, consequently, assignment would potentially modify the value of the expression

没错。我的编译器警告我:从“int”到“char”的隐式转换会将值从 1000 更改为 -24

As an application of this question; is it possible to write an expression involving a hardcoded number so big that it actually cannot be stored properly during execution?

编译器通常会简化常量表达式,因此如果您有一个包含数字的表达式,该数字足够小以至于编译器可以使用它,但又太大而无法存储到您尝试使用的任何类型中,那么是的,编译器会做正确的事情。如果我将您的示例更改为:

char foo = 1000/8;

来 self 的编译器的警告消失了。

关于c - 在 C 中赋值之前如何存储表达式值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62877614/

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