文档章节

C/C++ char 与 unsigned char 使用时要注意的问题

t
 tigerBin
发布于 2017/04/22 23:10
字数 284
阅读 26
收藏 0

测试环境:Win10 Professional , CodeBlocks 13.12

#include <stdio.h>

int main()
{
    char ch1 = 0x01;
    char ch2 = 0x80;

    printf("ch1 = %x , size = %d\n",ch1, sizeof(ch1));
    printf("ch2 = %x , size = %d\n",ch2, sizeof(ch2));
    return 0;
}

//output:
// ch1 = 1 , size = 1
// ch2 = ffffff80 , size = 1

问题分析:

ch1 = 0 000 0001
ch2 = 1 000 0000

由于ch1 , ch2 是char , 根据系统的不同,char 的类型可能不同,我的环境默认的char 是 signed char (即有符号数),所以第一位是符号位,而在调用 printf("%x",ch)时,会进行位扩展,由原有的 8位 -> 32位,在进行位扩展时,有符号数的符号位左移,无符号数则直接填充0,所以会出现下面的结果:

ch1 = 0000....0000 0 000 0001 = 0x00000001 = 0x1
ch2 = 1111....1111 1 000 0000 = 0xffffff80 = 0xffffff80

而如果采用下面的写法:

#include <stdio.h>

int main()
{
    unsigned char ch1 = 0x01; //无符号数
    unsigned char ch2 = 0x80;

    printf("ch1 = %x , size = %d\n",ch1, sizeof(ch1));
    printf("ch2 = %x , size = %d\n",ch2, sizeof(ch2));
    return 0;
}


//output:
// ch1 = 1 , size = 1
// ch2 = 80 , size = 1

根据前面讲解:

ch1 = 0000....0000 0000 0001 = 0x1
ch2 = 0000....0000 1000 0000 = 0x80

 

© 著作权归作者所有

共有 人打赏支持
t
粉丝 1
博文 66
码字总数 17693
作品 0
武汉
程序员
私信 提问
VC6中的MBCS和UNICODE编码

【转】 今天写的一段代码涉及到MBCS编码和UNICODE编码的相互转换,查了一下MSDN的相关资料,整理如下: 在VC6中,默认使用MBCS编码,即多字节字符,实际就是支持大于0x80的ASCII码。这样,一...

zhizii
2010/12/08
0
0
char类型是否有符号与不同编译环境相关

在跨平台的c/c++程序编程时需要注意,根据c++标准,char类型既可以是signed的,也可以是unsigned的;最近就碰到了这样的情况: 在linux arm平台上,编译出来的程序char类型为unsigned的,而在...

jaden1q84
2013/03/06
0
0
C#调用C的Dll(类型对照)

C#调用C的DLL //C++中的DLL函数原型为 //extern "C" declspec(dllexport) bool 方法名一(const char 变量名1, unsigned char 变量名2) //extern "C" declspec(dllexport) bool 方法名二(cons......

KavenSu
2014/04/30
0
0
ld: symbol(s) not found for architecture armv7错误

将两个c函数从cpp文件中分离出来单独放入一个c文件中,报了下面的错: Undefined symbols for architecture armv7: "MyEncrypt(unsigned char, int, unsigned char, int, unsigned char)", ......

yoyoso
2014/12/25
0
0
C语言中的一个大恶魔之溢出问题,“野兽出没”,小心小心再小心

整型溢出有点老生常谈了,但似乎没有引起多少人的重视。 整型溢出会有可能导致缓冲区溢出,缓冲区溢出会导致各种黑客攻击,比如最近OpenSSL的heartbleed事件,就是一个buffer overread的事件...

这个人很懒什么都没留下
2018/07/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式项目(五)iot-pgsql

书接上回,在Mapping server中,我们已经把数据都整理好了,现在利用postgresql存储历史数据。 iot-pgsql 构建iot-pgsql模块,这里我们写数据库为了性能考虑不在使用mybatis,换成spring jd...

lelinked
今天
2
0
一文分析java基础面试题中易出错考点

前言 这篇文章主要针对的是笔试题中出现的通过查看代码执行结果选择正确答案题材。 正式进入题目内容: 1、(单选题)下面代码的输出结果是什么? public class Base { private Strin...

一看就喷亏的小猿
今天
1
0
cocoapods 用法

cocoapods install pod install 更新本地已经install的仓库 更新所有的仓库 pod update --verbose --no-repo-update 更新制定的仓库 pod update ** --verbose --no-repo-update...

HOrange
今天
3
0
linux下socket编程实现一个服务器连接多个客户端

使用socekt通信一般步骤 1)服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。 2)客户端:socker()建立套接字,连接(connect)服务器,连接上后...

shzwork
昨天
3
0
android自定义viewgroup画背景

设计部要求背景实现一个背景边框带圆弧的效果: 所以想着用自定义控件画一个背景。 为了方便,继承的是LinearLayout,在onMeasure中先获取控件宽高: @Overrideprotected void onMeasure(in...

醉雨
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部