char 与 unsigned char的本质区别

在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255,8个bit,最多256种情况,因此无论如何都能表示256个数字。

主要是符号位,但是在普通的赋值,读写文件和网络字节流都没什么区别,反正就是一个字节,不管最高位是什么,最终的读取结果都一样,只是你怎么理解最高位而已,在屏幕上面的显示可能不一样。

但是我们却发现在表示byte时,都用unsigned char,这是为什么呢?
byte没有什么符号位之说,更重要的是如果将byte的值赋给int,long等数据类型时,系统会做一些额外的工作。
如果是char,那么系统认为最高位是符号位,而int可能是16或者32位,那么会对最高位进行扩展(注意,赋给unsigned int也会扩展)

而如果是unsigned char,那么不会扩展

这就是二者的最大区别。

#include <stdio.h>
#include <thread>
#define INC_TO 1000000 // one million...
#include <mutex>
#include <functional>
#include <atomic>
#include <vector>
#include <sstream>
#include <iostream>

void test_unsigned_char(const unsigned char uc) {
  char c = uc;
  printf("%c %c\n", c, uc);
  // char最高位符号位填充
  printf("%X %X\n", c, uc);
  unsigned int a = c, b=uc;
  printf("%d %d\n", a, b);

  int d=a, e=uc;
  printf("%d %d\n", d, e);
  printf("%X %X\n", d, e);
}

int main()
{
  test_unsigned_char(129);
  printf("最高位不是1:\n");
  test_unsigned_char(0x7F);

  int c = 0x7FFFFFFF;
  printf("%d\n", c);

  int e = 0x8FFFFF0;
  unsigned int k = e;
  printf("k:%d %X", k, e);
  return 0;
}

输出:

� �
FFFFFF81 81
-127 129
-127 129
FFFFFF81 81
最高位不是1:
 
7F 7F
127 127
127 127
7F 7F
2147483647
k:150994928 8FFFFF0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝鲸123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值