类型转换,C语言问题

4

我无法理解一些类型转换语法,例如:

float f=7.0;
short s=*(short *)&f;

这里发生了什么事情short s=*(short *)&f?看起来我们将something转换为指向short的指针,然后将s初始化为由something所指向地址上存储的值。
现在,这个something看起来像是变量f的地址。因此,如果something = f的地址,那么我们似乎是把f的地址作为某个short的指针,然后对其进行解引用操作。我知道我说错了,但我似乎无法想象它的过程。
谢谢。

有人回答了这个问题,但出于某种原因删除了它。他提到的一点是&f是一个指向浮点数的指针。我想我面临的问题是,我会将&f视为一个值,即一个地址,而不是一个变量/指针。所以这里发生的是将“指向浮点数的指针”强制转换为“指向短整型的指针”,对吗? - Naruto Uzumaki
1
@naruto-uzumaki 是的,你示例中的类型转换是从“指向浮点数的指针”到“指向短整型的指针”的指针转换。 - Pascal Cuoq
谢谢!每次在stackoverflow上发帖学到新东西都感觉很棒 :) - Naruto Uzumaki
2
@naruto-uzumaki:你说得对,&f是一个地址,而不是变量。然而,在C语言中,不仅变量,所有东西都有明确定义的类型。在这里,&f的类型是float *,即“指向浮点数”的指针。 - Oliver Charlesworth
如果我说&f是一个指向浮点数的指针,这样说正确吗?当我发帖说&f是一个变量/指针时,我基本上是指&f是一个指针(因为指针只是存储地址的“变量”,有时为了自己的清晰度,我会把指针称为变量。我应该放弃这个习惯:)) - Naruto Uzumaki
4个回答

5

如果shortfloat大小相同,那么这种语法是最有意义的,但即使是这样,仍然存在一个问题——"严格别名规则"。

它用于将float f的位解释为表示整数。 它用于规避s = (short) f;被解释为转换为整数的事实。 我相信这是截断。


2
你的理解是正确的。它基本上是强制编译器将存储 f 的内存视为实际处理 short 的内存。其结果将取决于平台。这与 short s = (short)f; 非常不同,后者只会执行一个良好定义的转换。

1

1.每当你进行类型转换时,它必须在括号内。 2.原始类型的内部范围(大小)不比其他原始类型(括号外)高。 3.在类型转换后,变量将存储在您要转换的相同原始类型中。 4.指针意味着它存储地址的内存。在C语言中,它将表示星号(*)。


0

应该是:

float f=7.0; 
short s=*(short)&f; 

即短变量被赋值为7


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接