`
film
  • 浏览: 224974 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[转]char 与 unsigned char的本质区别,体现在对最高位进行扩展

 
阅读更多

原文:http://www.cnblogs.com/qytan36/archive/2010/09/27/1836569.html

char 与 unsigned char的本质区别,体现在对最高位进行扩展

在C中,默的基数据类型均signed,在我以char例,明(signed) char与unsigned char之的区别

首先在内存中,charunsigned char没有什么不同,都是一个字,唯一的区别是,char的最高位符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255这个好理解,8bit,最多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有区别了。


分享到:
评论

相关推荐

    基于C语言char与unsigned char的区别介绍

    首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-127~127,unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,...

    四个595级联数码管程序

    //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(); ...

    linux c 语言串口调试

    无符号版本和有符号版本的区别就是有符号类型需要使用一个bit来表示数字的正负,比如16位系统中一个int能存储的数据的范围为–32768 ~ 32767(16位2进制的最高位作为符号位‘1’为负‘0’为正),而unsigned能存储的...

    竞赛抢答器(程序,仿真图.。。。。。。。。。)

    #include ... if((displaysag & 0x80)==0x80) //判断段码最高位 { sdata=1; //输出1 } else { sdata=0; //输出0 } clk=0; clk=1; //产生上升沿 displaysag; //段码左移1位 } }

    动态Bitset源代码

    在C++的STL中实现由一个bitset类模板,其用法如下: std::bitset&lt;64&gt; bs; 也就是说,这个bs只能支持64位以内的位存储和操作;bs一旦定义就不能动态增长了。本资源附件中实现了一个动态Bitset,和标准bitset兼容。 /*...

    JAVA基础之java的移位运算

    右移时,被移走的最高位(最左边的位)由原来最高位的数字补充。例如,如果要移走的值为负数,每一次右移都在左边补1,如果要移走的值为正数,每一次右移都在左边补0,这叫做符号位扩展(保留符号位)(sign ...

    智能温度测量

    if(b&gt;0x7f) //最高位为1 时温度是负 {a=~a; b=~b+1; //补码转换,取反加一 fg=0; //读取温度为负时fg=0 } sdata = a/16+b*16; //整数部分 xiaoshu1 = (a&0x0f)*10/16; //小数第一位 xiaoshu2 = (a&0x0f)*100/16;//...

    51单片机C语言编程基础及实例

    我们通常又将各二极与一个字节的 8 位对应,a(D0),b(D1),c(D2),d(D3),e(D4),f(D5),g(D6),h(D7), 相应 8 个发光二极管正好与单片机一个端口 Pn 的 8 个引脚连接,这样单片机就可以通过引脚输出高 低电平控制 8 个...

    普通IO模拟串口

    unsigned char IEN0_NOW,IEN1_NOW; //中断临时变量 unsigned char idata bRxstate=0; //接收状态 unsigned char idata tmp_Len=0; //缓存数组下标 unsigned char idata bRxlen; //接收字节数 unsigned char ...

    温度报警器

    void covert0( unsigned char TH, unsigned char TL) //将温度上下限转换为LCD显示的数据 { if(TH&gt;0x7F) //判断正负,如果为负温,将其转化为其绝对值 { TempBuffer0[3]=0x2d; //0x2d为"-"的ASCII码 TH=~TH; TH...

    modbus通信协议

    在其它网络上(象MAP和Modbus Plus)Modbus消息被转成与串行传输无关的帧。 1、ASCII模式 当控制器设为在Modbus网络上以ASCII(美国标准信息交换代码)模式通信,在消息中的每个8Bit字节都作为两个ASCII字符发送。...

    c语言程序设计标准教程

    当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。 main(){ unsigned a,b; printf("input a number: "); scanf("%d",&a); b=a&gt;&gt;5; b=b&15; ...

    C++零基础(数据类型)

    6 有符号 以二进制补码形式存储,最高位符号0(表示正)和1(负) 7 无符号 只能是整数 在计算机内以绝对值形式存放 char型和int型(包括long int)在默认(不加修饰)情况下是有符号的 常量和符号常量 1 0123表示...

    MSP430单片机课程设计-简单计算器设计.pdf

    LED的最高位显示 符号位,次高位空下来,其余六位显示要计算的数字。 (自我发挥:求平方根。) 三、程序流程图 MSP430单片机课程设计 四、程序源代码 #include &lt;msp430x14x.h&gt; #include "stdio.h" #include ...

    手把手教学51单片机 | 流水灯 蜂鸣器 继电器

    2.最高位左移变至最低位,次高位变最高位,以此类推。 3.执行顺序:变量先左移 再赋值给a 4.头文件include cror循环右移函数 参照循环左移函数,只是方向不同 续流二极管 反向接入二极管,短路感应电动势,从而保护...

    详解原码、反码与补码存储与大小

    如果机器字长为N个bit,那么一个数的原码就是N位二进制数,最高位 是符号位,1代表负数,0代表正数。 反码: 正数的反码就是原码,负数的反码就是符号位不变,其他取反。 补码: 正数的补码与其原码相同;负数...

    C语言程序设计标准教程

     长整数158L和基本整常数158 在数值上并无区别。但对158L,因为是长整型量,C编译系统将为它分配4个字节存储空间。而对158,因为是基本整型,只分配2 个字节的存储空间。因此在运算和输出格式上要予以注意,避免...

    在89s52上连接1602资料

    //位,保留最高位的值(就是忙标志位) E=0; //拉低E,至此完成E的高脉冲 return Busy; //返回刚读到的忙标志 } //---------------------------------------------------------------------------------...

    MySQL语句细解——笔记【更新中】

    文章目录开篇重点提示database 库相关table 表相关data 数据相关character 字符列类型整数型Int测试代码语句细解unsigned 无符号标识设定显示长度zerofill 显示长度保持最高位小数型FloatDoubleDecimal测试代码语句...

    sht30 基于C51单片机的驱动程序,可能需要修改

    #define uchar unsigned char void display(); unsigned char code tableduan[]= { 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71 }; uchar data DIS_ROME[6]= {0,0,...

Global site tag (gtag.js) - Google Analytics