Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将带有随机字符元素的字符[]转换为一个int 我一直在尝试用C++读取STL文件中的二进制数据。我在网上找到了一些方法,其中包括一个我不理解的过程: char f1[4] = { facet[0],facet[1],facet[2],facet[3] }; float xx = *((float*)f1);_C++ - Fatal编程技术网

将带有随机字符元素的字符[]转换为一个int 我一直在尝试用C++读取STL文件中的二进制数据。我在网上找到了一些方法,其中包括一个我不理解的过程: char f1[4] = { facet[0],facet[1],facet[2],facet[3] }; float xx = *((float*)f1);

将带有随机字符元素的字符[]转换为一个int 我一直在尝试用C++读取STL文件中的二进制数据。我在网上找到了一些方法,其中包括一个我不理解的过程: char f1[4] = { facet[0],facet[1],facet[2],facet[3] }; float xx = *((float*)f1);,c++,C++,我知道每个字符都可以通过ASCII码转换为int,但我不知道如何将字符数组转换为一个int: 这一转变的背后是什么?是什么使一个字符[]成为一个特定的int或float?让我们分别举两个例子: char f1[4] = { facet[0],facet[1],facet[2],facet[3] }; 这声明了一个由四个字符组成的数组,并给它们一些值 f1 作为一个表达式,它属于“四个字符元素的数组”类型,但在大多数上下文中,它会退化为“指向字符的指针”(指向第一个元素) 这会将“指向字符的指

我知道每个字符都可以通过ASCII码转换为int,但我不知道如何将字符数组转换为一个int:


这一转变的背后是什么?是什么使一个字符[]成为一个特定的int或float?

让我们分别举两个例子:

char f1[4] = { facet[0],facet[1],facet[2],facet[3] };
这声明了一个由四个字符组成的数组,并给它们一些值

f1
作为一个表达式,它属于“四个字符元素的数组”类型,但在大多数上下文中,它会退化为“指向字符的指针”(指向第一个元素)

这会将“指向字符的指针”转换为“指向浮点的指针”。它生成一个指针,编译器被告知该指针指向内存中的一个浮点(尽管实际上它指向一个字符数组)。这也可以写成:

reinterpret_cast<float*>(f1)
这将间接通过指针,并将四个字符视为浮点。它非常接近严格的别名规则的边缘,我认为它跨越了这些规则。避免这种代码。(除了严格的别名规则外,如果CPU要求对齐浮点变量,并且字符数组没有适当对齐,它也可能崩溃)

最后,这声明了一个float变量,并将我们上面计算的值赋给它。这可能会产生xx中的陷阱值

您可以通过以下方式避免大多数危险:

char f1[4] = { facet[0],facet[1],facet[2],facet[3] };
float xx;
memcpy(&xx, f1, 4);
这会将f1中的四个字节复制到xx的内存中。它仍然可以是一个陷阱值,但至少不会违反严格的别名规则,或者未对齐

char foo[3] = { 'a','b','c' };
int x = (int)foo;

这要简单得多。它将
foo
的地址强制转换为int,并将int存储在
x
中。这可能有用,但通常不是(特别是在64位应用程序中,
int
通常不够大)。

就转换而言,我认为第一个是将一系列4个字符的值解释为一个浮点值(假设
float
是4个字节),第二个,我相信只是转换指针值(从数组名衰减为指针)到整数。我特别喜欢您提到的一些CPU的严格对齐注意事项。
*((float*)f1)
float xx = *((float*)f1); 
char f1[4] = { facet[0],facet[1],facet[2],facet[3] };
float xx;
memcpy(&xx, f1, 4);
char foo[3] = { 'a','b','c' };
int x = (int)foo;