探究char类型

本文探讨了char、signed char及unsigned char的区别,重点分析了不同类型的指针混用的问题,并通过实例展示了不同类型之间的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        一般的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

这里又得到了为什么不能混用这三种类型指针的原因,对同一块内存空间,不同的指针类型的解引用会得到不同的结果,这显然不是程序员希望看到的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值