转载: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的最高位来扩展
分享到:
相关推荐
实现了c语言int char的完美转换 可用于通信方面的收发指令
总的来说,理解`char`数据类型及其与`int`之间的转换是C语言编程的基础,对于处理字符和数字的交互、字符串解析等任务至关重要。正确理解和运用这些知识可以避免潜在的类型转换错误,并提高代码的可读性和效率。
程序说明:输入123,输出‘1’‘2’‘3’(后面三个就是字符输出)。
在Linux系统中,使用C语言实现文件夹复制是一项常见的任务,尤其对于系统级编程和文件管理应用程序来说。这里我们将深入探讨如何使用C语言在Linux环境下完成这个任务,以及相关的技术要点。 首先,我们需要理解...
C语言中 int main(int argc,char *argv[])的两个参数详解 argc是命令行总的参数个数; argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数。命令行后面跟的用户输入的参数。 int main(int argc, char* ...
char *MultiCombine(char *a[], int num); ``` 这里的参数`a`是一个指向`char *`类型的指针数组,意味着它是一个二维数组,每个元素都是一个字符串的首地址。参数`num`则表示`a`数组中字符串的数量。 要合并这些...
::MultiByteToWideChar(CP_ACP, 0, (const char*)str, int(nu), buffer, int(n)); buffer[n] = 0; } return buffer; // 注意:这里原本有delete buffer; 但new与delete匹配,用于释放动态分配的内存 delete...
本文将深入探讨一种从整型(int)转换为字符型(char[])的实现方式——int2char函数,以及它与itoa()和sprintf()函数的关系。通过分析标题、描述、标签和部分代码内容,我们将详细解析这些知识点。 ### int2char函数:...
本文将深入探讨如何使用C语言编写字符串复制程序,以及涉及的相关知识点。 首先,我们要了解C语言中的字符串复制函数`strcpy()`,它位于`<string.h>`库中。`strcpy()`函数用于将一个字符串复制到另一个字符串,基本...
操作系统实验中的一个重要任务是使用C语言编程实现复制文件,这涉及到对文件系统调用的深入理解和熟练运用。在这个实验中,主要涉及了四个关键的系统调用:`creat`、`open`、`read`和`write`。 1. `creat`函数用于...
而char类型的数组则是C语言中的传统字符串表示方式。两者之间的转换可以通过以下方式进行: 1. **CString到char**:可以使用`LPCTSTR`或`LPSTR`类型的指针来获取CString内部的char指针,然后通过`strcpy`函数拷贝到...
- 变量是存储数据的容器,C语言提供了多种基本数据类型,如int(整型)、char(字符型)、float(浮点型)和double(双精度浮点型)等。 - 了解它们的存储大小和范围是必要的,例如,int在大多数系统上占用4个字节...
c语言的itoa:char *m_itoa(int n) 整数转换为字符串。char *m_itoh(unsigned int num, int length, int prefix)整数转换为0x十六进制字符串。num: 要转换的数字,无视符号。length:指定字节长度,一字节为2个十六进制...
本文将深入探讨标题和描述中提到的"复制文件"以及相关函数,如`fgets`、`fputs`和`fgetc`在C语言中的使用。 首先,我们关注的是文件复制。在C语言中,可以使用标准输入输出库提供的函数来实现文件的复制。通常,...
int substring char res int pos int len char substr 从pos开始取len个字符到substr中 返回1成功 0失败 int strindex char res int pos char substr 返回substr在resource中在pos后出现的位置 返回0表示没找到 int ...
C语言结构体类型 C语言结构体类型是一种复杂的数据类型,它允许用户建立一种集不同数据类型于一体的数据构造类型。结构体类型的定义需要在程序中自己建立所需的结构体类型,包括成员的声明,每个成员所具有的数据...
在C语言中,数据类型是严格区分的,`int` 和 `byte` 是两种不同的数据类型,它们在内存中占据的字节数和表示的数值范围都有所不同。`int` 通常用来存储整数,而 `byte` 通常是一个单字节的数据类型,用于存储较小的...