Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.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
使用C++; 我试图用C++将4字节转换成整数。_C++ - Fatal编程技术网

使用C++; 我试图用C++将4字节转换成整数。

使用C++; 我试图用C++将4字节转换成整数。,c++,C++,这是我的代码: int buffToInteger(char * buffer) { int a = (int)(buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[3]); return a; } int buffToInteger(字符*缓冲区) { int a=(int)(buffer[0]在表达式buffer[0]中,您的buffer包含有符号字符。因此,实际上,bu

这是我的代码:

int buffToInteger(char * buffer)
{
    int a = (int)(buffer[0] << 24 | buffer[1] << 16 | buffer[2] << 8 | buffer[3]);
    return a;
}
int buffToInteger(字符*缓冲区)
{

int a=(int)(buffer[0]在表达式
buffer[0]中,您的
buffer
包含有符号字符。因此,实际上,
buffer[0]=-29
,在转换为
int
时,符号扩展到
0xfffffff3
,反过来
(0x3e在移位中有符号整数的隐式提升。
这是因为char(显然)是在您的平台上签名的(常见的事情),并且

这将获取一个缓冲区引用,将其类型转换为int引用,然后取消引用。

我认为这也可以通过使用
memcpy来实现:

int buffToInteger(char* buffer)
{
    int a;
    memcpy( &a, buffer, sizeof( int ) );
    return a;
}
这比原始文章中提到的示例要快得多,因为它只按“原样”处理所有字节,不需要执行任何操作,如位移位等。
它也不会导致任何有符号-无符号问题。

“。代码不会按预期工作”:您的代码确实按预期工作(因为我希望这种行为具有有符号字节值)。@Jongware为什么返回FFFFFF E1而不是16102?您能解释一下吗?@i486问题不在Endian中。@TonyD:这不对。(但您正在寻找正确的邻居。)这不是未定义的行为吗?据我所知,
(unsigned char)(buffer[0])的结果类型它还可以将4字节转换为无符号整数吗?还是需要修改?@atari83除了返回值和函数内部的明显变化外,它应该可以。它只取决于表示包含无符号整数的小端数组的字符。嗨,Mylotyrena,欢迎使用堆栈溢出!请明白为什么你的代码能解决这个问题。这可能会导致尾数问题,因为字节可以是小尾数顺序,整数可以是大尾数顺序。
#include <iostream>
#include <iomanip>

int buffToInteger(char * buffer)
{
    int a = static_cast<int>(static_cast<unsigned char>(buffer[0]) << 24 |
        static_cast<unsigned char>(buffer[1]) << 16 | 
        static_cast<unsigned char>(buffer[2]) << 8 | 
        static_cast<unsigned char>(buffer[3]));
    return a;
}

int main(void) {
    char buff[4]={0x0,0x0,0x3e,static_cast<char>(0xe3)};
    int a=buffToInteger(buff);

    std::cout<<std::hex<<a<<std::endl;

    // your code goes here
    return 0;
}
char buffer[4];
int a;
a = *(int*)&buffer;
int buffToInteger(char* buffer)
{
    int a;
    memcpy( &a, buffer, sizeof( int ) );
    return a;
}