`

c语言 char 复制给 int的问题

 
阅读更多

转载: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类型转换

    实现了c语言int char的完美转换 可用于通信方面的收发指令

    详解C语言中的char数据类型及其与int类型的转换

    总的来说,理解`char`数据类型及其与`int`之间的转换是C语言编程的基础,对于处理字符和数字的交互、字符串解析等任务至关重要。正确理解和运用这些知识可以避免潜在的类型转换错误,并提高代码的可读性和效率。

    C 语言 IntToChar 整数型转换字符型

    程序说明:输入123,输出‘1’‘2’‘3’(后面三个就是字符输出)。

    linux C语言 文件夹复制

    在Linux系统中,使用C语言实现文件夹复制是一项常见的任务,尤其对于系统级编程和文件管理应用程序来说。这里我们将深入探讨如何使用C语言在Linux环境下完成这个任务,以及相关的技术要点。 首先,我们需要理解...

    C语言中 int main(int argc,char *argv[])的两个参数详解

    C语言中 int main(int argc,char *argv[])的两个参数详解 argc是命令行总的参数个数; argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数。命令行后面跟的用户输入的参数。 int main(int argc, char* ...

    char与wchar_t互转

    ::MultiByteToWideChar(CP_ACP, 0, (const char*)str, int(nu), buffer, int(n)); buffer[n] = 0; } return buffer; // 注意:这里原本有delete buffer; 但new与delete匹配,用于释放动态分配的内存 delete...

    C语言合并多个char *类型的字符串

    char *MultiCombine(char *a[], int num); ``` 这里的参数`a`是一个指向`char *`类型的指针数组,意味着它是一个二维数组,每个元素都是一个字符串的首地址。参数`num`则表示`a`数组中字符串的数量。 要合并这些...

    int2char函数

    本文将深入探讨一种从整型(int)转换为字符型(char[])的实现方式——int2char函数,以及它与itoa()和sprintf()函数的关系。通过分析标题、描述、标签和部分代码内容,我们将详细解析这些知识点。 ### int2char函数:...

    c语言字符串复制代码

    本文将深入探讨如何使用C语言编写字符串复制程序,以及涉及的相关知识点。 首先,我们要了解C语言中的字符串复制函数`strcpy()`,它位于`&lt;string.h&gt;`库中。`strcpy()`函数用于将一个字符串复制到另一个字符串,基本...

    操作系统实验用C语言编程实现复制文件

    操作系统实验中的一个重要任务是使用C语言编程实现复制文件,这涉及到对文件系统调用的深入理解和熟练运用。在这个实验中,主要涉及了四个关键的系统调用:`creat`、`open`、`read`和`write`。 1. `creat`函数用于...

    CString,char,int,COleDateTime,CTime,time_t之间的相互转换

    而char类型的数组则是C语言中的传统字符串表示方式。两者之间的转换可以通过以下方式进行: 1. **CString到char**:可以使用`LPCTSTR`或`LPSTR`类型的指针来获取CString内部的char指针,然后通过`strcpy`函数拷贝到...

    C语言常见问题集 C语言常见问题集

    - 变量是存储数据的容器,C语言提供了多种基本数据类型,如int(整型)、char(字符型)、float(浮点型)和double(双精度浮点型)等。 - 了解它们的存储大小和范围是必要的,例如,int在大多数系统上占用4个字节...

    c语言的itoa,浮点,int整数转换为字符串,整型转十六进制字符,兼容单片机STM等C开发用

    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语言中,可以使用标准输入输出库提供的函数来实现文件的复制。通常,...

    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语言结构体.ppt

    C语言结构体类型 C语言结构体类型是一种复杂的数据类型,它允许用户建立一种集不同数据类型于一体的数据构造类型。结构体类型的定义需要在程序中自己建立所需的结构体类型,包括成员的声明,每个成员所具有的数据...

    C语言如何将int转byte类型

    在C语言中,数据类型是严格区分的,`int` 和 `byte` 是两种不同的数据类型,它们在内存中占据的字节数和表示的数值范围都有所不同。`int` 通常用来存储整数,而 `byte` 通常是一个单字节的数据类型,用于存储较小的...

Global site tag (gtag.js) - Google Analytics