转载:http://www.cnblogs.com/xiekeli/archive/2012/02/10/2345649.html
今天在写代码的过程中对一个函数进行了重构,函数的用处是将一块内存中的内容打印成16进制表示的字符串;很悲哀的输入的是一个char指针:char* buffer;当调用Format("%02X",*buffer)的时候出现问题了,
比如:0xB0输出变成了:“FFFFFFB0”;最后发现是char惹得祸;
char取为unsigned char还是signed char是平台相关的,而我的平台中,char默认为有符号的,那么(signed)char和unsigned char究竟有什么区别呢?
char带符号能表示-128~127, unsigned char没有符号位,能表示0~255;而本质上都是表示8位的数字。
但是我们如果要表示byte时(C本身没有byte类型),应该用unsigned char,这是为什么呢?
因为当用char对int进行赋值时,系统认为最高位是符号位,而int可能是16或者32位,那么会对最高位进行扩展(注意,赋给unsigned int也会扩展)
而如果是unsigned char,那么不会扩展。
这就是二者的最大区别。
同理可以推导到其它的类型,比如short, unsigned short。等等
还是用例子来说明问题吧:
#include "stdafx.h"
#include <stdio.h>
void test(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[])
{
test(0xB0);
test(0x68);
return 0;
}
运行结果:
所以,如果表示的是byte的情况,建议用unsigned char;当然,如果非要用char也可以;加上& 0xFF也能解决问题吧。
补充:
test(0xB0);//1011 0000
test(0x68);//0110 1000
在复制给int时: 0xB0 改为 1111 1111 1111 1111 1111 1111 1111 1111 1011 0000
在复制给int时: 0x68 改为 0000 0000 0000 0000 0000 0000 0000 0000 0110 1000
在扩展时安装char的最高位来扩展
分享到:
相关推荐
该项目是一款基于freeRTOS操作系统和STM32F103x微控制器的手机远程控制浴室温度系统设计源码,共包含1087个文件,包括580个C语言源文件、269个头文件、45个汇编源文件、36个数据文件、36个目标文件、35个编译规则文件、28个包含文件、27个文本文件、6个源文件、3个归档文件。此系统通过手机远程实现对浴室温度的有效控制,适用于智能浴室环境管理。
labview程序代码参考学习使用,希望对你有所帮助。
labview程序代码参考学习使用,希望对你有所帮助。
labview程序代码参考学习使用,希望对你有所帮助。
labview程序代码参考学习使用,希望对你有所帮助。