存储在char *中的Typecasting back int值(0-255)给出负值

时间:2018-03-24 11:26:20

标签: c++

#include<iostream>
#include<fstream>
#define TRANSFORMS 4
#define BLOCK 4
using namespace std;
char* img=new char[128*128*TRANSFORMS];
int main(){
ifstream File;
File.open("ficdata");
int isize=128*TRANSFORMS*128;
int inc=TRANSFORMS*128;
int jsize=128*TRANSFORMS;
int i=0,j=0,temp;
while(!File.eof())
{
    File>>temp;
    img[i+j]=temp;
    j+=TRANSFORMS;
    if(j==jsize){
        j=0;
        i+=inc;
    }
    if(i==isize){
        break;
    }
}
for(int i=0;i<isize;i+=inc){
    for(int j=0;j<jsize;j+=TRANSFORMS){
        cout<<(int)img[i+j]<<" ";
    }
}
}

在上面的代码片段中,该文件包含128 * 128个值,介于0-255之间。当我尝试将值回输到int并打印它们时,我得到一些值为正值,一些值为负值。为什么这样做发生了什么?int值被正确存储,只有在对它们进行类型转换时才会出现问题。

1 个答案:

答案 0 :(得分:1)

char具有实现定义的签名。在某些平台上,它与unsigned char(通常为0 .. 255)具有相同的范围,在其他平台上,它与signed char具有相同的范围(通常为-128 .. 127)。

显然,在您的系统上,它已签名,因此将值保存在127以上会产生负数。您可以通过将img更改为unsigned char来解决此问题。

此外,我没有理由看到动态分配img。你可以做到

unsigned char img[128*128*TRANSFORMS];