c语言char赋给int,c语言 char 复制给 int的问题

本文探讨了C语言中char类型赋值给int类型时出现的问题,特别是有符号char与无符号char的区别。当char是有符号类型时,最高位被视为符号位,在赋值给int时可能导致意外的高位扩展。无符号char则不会遇到此类问题。通过示例代码展示了这种差异,并建议在处理可能包含负值的字节时使用unsigned char。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在写代码的过程中对一个函数进行了重构,函数的用处是将一块内存中的内容打印成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

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;

}

运行结果:

a11cc95fa3f0d651e5ca5b8adc6b876b.png

所以,如果表示的是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的最高位来扩展

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值