我有一个原型函数,void* myFcn(void* arg)用作pthread的起点.我需要将参数转换为int以供以后使用:
int x = (int)arg;
Run Code Online (Sandbox Code Playgroud)
编译器(GCC版本4.2.4)返回错误:
file.cpp:233: error: cast from 'void*' to 'int' loses precision
Run Code Online (Sandbox Code Playgroud)
投这个的正确方法是什么?
问题很简单.据我了解,GCC坚持认为字符将是字节对齐的,并且在32位环境中对齐4字节对齐.我也知道C99标准6.3.2.3,它表示在未对齐的指针类型之间进行转换会导致未定义的操作.C的其他标准对此有何评论?这里也有许多经验丰富的编码员 - 对此有任何看法将不胜感激.
int *iptr1, *iptr2;
char *cptr1, *cptr2;
iptr1 = (int *) cptr1;
cptr2 = (char *) iptr2;
Run Code Online (Sandbox Code Playgroud) 我读的越多,我就越困惑.
相关问题的最后一个问题与我的问题最接近,但是我对所有关于对象生命周期的问题感到困惑,尤其是 - 只读或不读.
直截了当.如我错了请纠正我.
这很好,gcc没有发出警告,我正试图" 通过" 读取类型T(uint32_t)char*:
uint32_t num = 0x01020304;
char* buff = reinterpret_cast< char* >( &num );
Run Code Online (Sandbox Code Playgroud)
但这是"坏"(也是一个警告),我正在尝试"反过来":
char buff[ 4 ] = { 0x1, 0x2, 0x3, 0x4 };
uint32_t num = *reinterpret_cast< uint32_t* >( buff );
Run Code Online (Sandbox Code Playgroud)
第二个如何与第一个不同,特别是当我们谈论重新排序指令(用于优化)时?另外,添加const不会以任何方式改变这种情况.
或者这只是一条直接规则,它明确指出:"这可以在一个方向完成,但在另一个方向不能完成"?我在标准中找不到任何相关内容(特别是在C++ 11标准中搜索过).
C和C++是否相同(因为我读了一条评论,暗示它与2种语言不同)?
我曾经union"解决"这个问题,但仍然看起来并非 100%正常,因为标准无法保证(这表明我只能依赖于最后一次修改的值union).
所以,经过大量阅读,我现在更加困惑.我想只是memcpy"好"的解决方案?
相关问题:
编辑
现实世界的情况:我有一个第三方库(http://www.fastcrypto.org/),它计算UMAC并返回值char[ 4 ].然后我需要将其转换为uint32_t.而且,顺便说一句,lib使用的东西((UINT32 …