一般的char是有符号还是无符号的是依赖于机器的,但是一个普通的char必然等同于signed char 或者unsigned char之一,由于这三者类型的不同,所以你不能混用这三种类型的指针。
unsigned char uc = 123;
char *pc = &uc; //出错,试图将一个unsigned char * 赋值到 char *
但是这三种类型的变量可以自由的相互赋值,当然,如果给一个signed char赋一个过大的(>128)的值,结果是未知的。
关于这三者的类型转换:
转换内存地址的二进制代码不变。所以可以互相转换。
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char uc = 129;
ofstream ofs("out.txt", ios::binary);
cout<<(int)uc<<endl;
ofs.write((char*)&uc, sizeof(uc));
char c = char(uc);
cout<<(int)c<<endl;
ofs.write(&c, sizeof(c));
ofs.close();
return 0;
}
打开out.txt,切换到二进制查看模式,都是0x81.
由于转换到int过程中对内存地址的解释的不同,
控制台输出: 129(unsigned char 内存0x81第一个bit解释为数字位)
-127(char 内存0x81第一个bit解释为符号位,0x81为-127的补码表示)
下面这段代码可能更加清楚一些,可以看出对同一块内存地址0x81,不同的类型解释,得到不同的结果。
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char uc = 129;
unsigned char *puc = &uc;
char *pc = (char*)puc;
cout<<int(*puc)<<endl;
cout<<int(*pc)<<endl;
return 0;
}
输出: 129
-127
这里又得到了为什么不能混用这三种类型指针的原因,对同一块内存空间,不同的指针类型的解引用会得到不同的结果,这显然不是程序员希望看到的情况。
unsigned char uc = 123;
char *pc = &uc; //出错,试图将一个unsigned char * 赋值到 char *
但是这三种类型的变量可以自由的相互赋值,当然,如果给一个signed char赋一个过大的(>128)的值,结果是未知的。
关于这三者的类型转换:
转换内存地址的二进制代码不变。所以可以互相转换。
#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char uc = 129;
ofstream ofs("out.txt", ios::binary);
cout<<(int)uc<<endl;
ofs.write((char*)&uc, sizeof(uc));
char c = char(uc);
cout<<(int)c<<endl;
ofs.write(&c, sizeof(c));
ofs.close();
return 0;
}
打开out.txt,切换到二进制查看模式,都是0x81.
由于转换到int过程中对内存地址的解释的不同,
控制台输出: 129(unsigned char 内存0x81第一个bit解释为数字位)
-127(char 内存0x81第一个bit解释为符号位,0x81为-127的补码表示)
下面这段代码可能更加清楚一些,可以看出对同一块内存地址0x81,不同的类型解释,得到不同的结果。
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char uc = 129;
unsigned char *puc = &uc;
char *pc = (char*)puc;
cout<<int(*puc)<<endl;
cout<<int(*pc)<<endl;
return 0;
}
输出: 129
-127
这里又得到了为什么不能混用这三种类型指针的原因,对同一块内存空间,不同的指针类型的解引用会得到不同的结果,这显然不是程序员希望看到的情况。