原文:http://www.cnblogs.com/qytan36/archive/2010/09/27/1836569.html
char 与 unsigned char的本质区别,体现在对最高位进行扩展
在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) 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,那么不会扩展。
这就是二者的最大区别。
同理可以推导到其它的类型,比如short, unsigned short。等等
具体可以通过下面的小例子看看其区别
include <stdio.h>
void f(unsigned char v)
{
char c = v;
unsigned char uc = v;
unsigned int a = c, b = uc;
int i = c, j = uc;
printf("----------------\n");
printf("%%c: %c, %c\n", c, uc);
printf("%%X: %X, %X\n", c, uc);
printf("%%u: %u, %u\n", a, b);
printf("%%d: %d, %d\n", i, j);
}
int main(int argc, char *argv[])
{
f(0x80);
f(0x7F);
return 0;
}
输出结果:
----------------
%c: ?, ?
%X: FFFFFF80, 80
%u: 4294967168, 128
%d: -128, 128
----------------
%c: ,
%X: 7F, 7F
%u: 127, 127
%d: 127, 127
由此可见,最高位若为0时,二者没有区别,若不为0时,则有区别了。
分享到:
相关推荐
首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-127~127,unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,...
在C语言中,`char` 和 `unsigned char` 都是用来表示字符数据类型的,但它们之间存在一些重要的差异。理解这些差异对于编写高效且安全的C代码至关重要。 首先,`char` 类型是C语言的基本数据类型之一,它用于存储...
unsigned与signed的区别在于对其位模式的解释,也就是最高位的处理不同。无符号整数把所有位处理为数据位,而有符号整数视最高位为符号位,当其值为1时表示该数为负,值为0时表示该数为正。 在C语言中,对整型使用...
有符号类型需要使用一个bit 来表示数字的正负,比如 16 位系统中一个 int 能存储的数据的范围为-32768~32767(16 位 2 进制的最高位作为符号位‘1’为负‘0’为正)。 Unsigned 关键字: Unsigned 类型是指不使用...
在实际编程中,由于编译器可能对`char`的默认解释有所不同,因此在编写跨平台或有特定需求的代码时,建议显式地声明`char`为`signed`或`unsigned`。 `char`与`int`之间的转换是非常常见的操作。将`char`转换为`int`...
该算法的关键在于每次迭代中检查最高位并根据最高位的值进行异或和左移操作。以下是一个8位乘法的伪代码实现: ```cpp unsigned char mul(unsigned char a, unsigned char b) { unsigned char p = 0; // 初始化积...
例如,char类型的变量如果存储值0xe3,由于0xe3的最高位为1,它在内存中会被解释为负数的扩展,而不是0x000000e3。相对的,使用unsigned char则可以确保其值正确无误地被处理为0x00e3。 在编写使用位运算的代码时,...
这是因为`printf`默认将`char`解释为有符号整数,对于有符号的8位整数,它会扩展到16位(在大多数32位系统上)并填充最高位以保持符号。例如,如果你有一个`char`变量`c = 0x34`,它在内存中存储为`00110100`,`...
我们通常又将各二极与一个字节的 8 位对应,a(D0),b(D1),c(D2),d(D3),e(D4),f(D5),g(D6),h(D7), 相应 8 个发光二极管正好与单片机一个端口 Pn 的 8 个引脚连接,这样单片机就可以通过引脚输出高 低电平控制 8 个...
- `void DS1302_GetTime(unsigned char *year,unsigned char *month,unsigned char *day,unsigned char *week,unsigned char *hour,unsigned char *minute,unsigned char *second)`:读取DS1302的当前时间。...
在char型与int型之间的转换中,需要注意的是char型数值赋给int型变量时,只保留其最低8位,高位部分舍弃。 在int型与long型之间的转换中,需要注意的是long型数据赋给int型变量时,将低16位值送给int型变量,而将高...
C51是一种针对MCS-51系列单片机的专用C语言,它的数据类型与标准C语言相似但有所扩展,以适应嵌入式系统的特性。以下是对C51数据类型的详细说明: 1. 字符型(char): C51中的字符型包括signed char和unsigned ...
需要注意的是,从`char`或`signed char`转换为`int`时,如果`char`包含负值,其最高位(符号位)会被扩展,可能导致数值的负数部分扩大,因此处理可能超出8位范围的数值时,使用`unsigned char`更合适。 在输出这些...
//set dataline high 0X80 最高位与SendVal左移的最高位 进行逻辑运算 else MOSIO=0; // 如果为真 MOSIO = 1 S_CLK=0; NOP(); NOP(); S_CLK=1; } R_CLK=0; //set dataline low NOP(); NOP(); ...
相反,`int`是有符号整型,它在32位系统中通常也占用32位,但其中最高位用作符号位,表示正负。正数的最高位为0,负数的最高位为1。因此,`int`类型的有效位数只有31位,最大正整数值是2的31次方减1,即`2^31 - 1`。...
在二进制表示中,有符号数据会用最高位(符号位)表示正负,而无符号数据则不考虑这一位。例如,`signed char`可以表示-128到127的整数,而`unsigned char`可以表示0到255的整数。 6. **数据类型与字符编码**: - ...