C/C++ char和int的区别

字符字面值一般是用一对单引号来表示。char类型一般就是用字符字面值来初始化、赋值。由于char类型的是单字节长度,当给char类型的变量用字符字面值赋值时,当单引号里面的内容超过一个字节时,系统会自动截取一个字节的内容给char变量,忽略其他的字节内容。
    比如char a=‘1234‘;c++会认为单引号里的每一个数值都看做一个字符字面值,也就是说1 2 3 4各占一个字节,‘1234‘也就是一共占4个字节,然而char变量a只是占一个字节,初始化它的值却有4个字节,系统要从‘1234‘中截取一个字节的内容给a,然而是截取‘1‘给a吗?不是,是把‘4‘给a。因为在x86平台(http://baike.baidu.com/view/339142.htm)上,数据是以little-endian(http://baike.baidu.com/view/2368412.htm)的形式排列的,低位字节放在内存的低地址,高位字节放在内存的高地址。我们看‘1234‘,从左到右从1到4,然而在计算机中存放的格式是从0x04到0x01,就是说‘1234‘的低位4存放在计算机的内存低地址位,‘1234‘的高位1存放在内存的高地址位,所以当把‘1234‘给变量a时,系统把内存中的地址中存放的4给a,其余的全部不要了。
再如:char b=‘啊‘;由于一个汉字是双字节的,系统会截取其中一个字节给char,但鬼才知道截取的那个字节是什么,所以cout<<b时会出现乱码。
当给char变量赋值正确的用ASII表中的字符,比如char c=‘!‘,单引号里面的内容是什么,cout就会输出什么。
当给char变量用一个整形字面字初始化时,比如char d=55,这时系统会根据在ASII表中这个整型值代表的控制字符是什么,就会输入什么,比如在ASii表中55是‘7‘的ASII值,cout<<d;的结果就是7。char对应ascii值如果是可显示字符就可以输出来,如果是不可显示字符,就输不出来.就好像0x0D和0x0A它们分别表于回车符和换行符,但是在它们本身没有一个形状能表示这些字符得,就没办法显示出来了.
然而ASCII表中只有0到127这128种,如果当大于127的整数甚至是大于255给char时,系统的运行结果未知。
字符串字面值,也就是双引号来定义的,一般称作为c风格字符串,他的类型应该是char*,所以char e="t";是会发生编译错误的。
对于int变量,int f=10;自然是正确的,这不用多解释了。然而如果把一个字符字面值给int,如int g=‘a‘,会把字符a在ASCII表中的ASCII值(也就是97)给a,cout<<g;的结果就是97。
如果把一个多字符字面值给int,如int h=‘abc‘;cout<<h;的结果是6382179。这个就需要好好解释下了,首先‘a‘的ASCII值是97,内存中占一个字节8位,就是01100001,b是01100010,c是01100011。由于int是32位的,不够的位用0补齐,在存入内存时,a是高位所以存到高地址位,c是低位所以存到低地址位,四个字节从低地址到高地址依次是
01100011
01100010
01100001
00000000
读取的时候跟存入的时候整好相反,先读高地址位,然后低地址位,也就是00000000 01100001 01100010 01100011 这32位代表的十进制整型值整好是6382179。

时间: 2024-10-12 12:23:13

C/C++ char和int的区别的相关文章

read(char[] b,int off,int len) 和read(char[] b)的区别

今天在读取文件里的十六进制数据的时候,采用java的read(char[] b)方法进行读取,结果发现打印的数据和文件里的数据结尾不一致.后来一看还有一个read(char[] b,int off,int len) 方法.就去查了一个它们的区别,正好read(char[] b,int off,int len) 可以解决我的问题.下面是网上参考的资料,很容易懂. 这是read(char cbuf[])方法的源码,可以看出,read方法其实是调用了read(char[] b,int off,int

char* str=&quot;bbo&quot;;char s1[]=&quot;bbo&quot;的区别

;表达式运算得到的结果是常量值(不可写),常量是没有内存空间的编译的时候就会把常量放到常量区,以后不能修改 字符串是字符串常量,字符是字符常量(修改),看到的能修改的都是已经从常量区放到寄存器,在mov到变量中了所以能修改 char* str="helloworld";char s1[]="bbo"的区别 int main(int argc, char* argv[]){ int a=1; char* str="bbo"; *str='m';//

C语言补漏(1)--- char到int赋值的一个陷阱

作为一个C的新手(虽然学的第一门语言就是C,可是用C实际开发项目却是最近的事情),对使用C过程中遇到的各类问题.疑惑.知识漏洞进行弥补无疑是非常有必要的,于是决定将每次遇到的知识漏洞写到博客上. 今天在写代码的过程中对一个函数进行了重构,函数的用处是将一块内存中的内容打印成16进制表示的字符串:很悲哀的输入的是一个char指针:char* buffer:当调用Format("%02X",*buffer)的时候出现问题了, 比如:0xB0输出变成了:“FFFFFFB0”:最后发现是cha

C语言scanf与get char,gets的区别

C语言scanf与get char,gets的区别 1.scanf() scanf是C语言的格式输入函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息.可以读入任何固有类型的数据并自动把数值变换成适当的机内格式. 在这里我想 列下一个'格式化说明符'的表来自于下面这个链接 (https://blog.csdn.net/21aspnet/article/details/174326) (A)                格式化说明符 格式字符           说明 %a 

Integer和int的区别

Java两种数据类型: 1):基本数据类型:byte,char,short  int float long double.boolean 2):引用数据类型: 数组.类.接口. 级别从低到高为:byte,char,short(这三个平级)-->int-->float-->long-->double 自动类型转换:从低级别到高级别,系统自动转的: 强制类型转换:什么情况下使用?把一个高级别的数赋给一个别该数的级别低的变量: [八种基本数据类型的包装类] byte ——Byte  ch

OC成长之路 &lt;一&gt; 位运算符、枚举、(原码,补码,反码)、以及NSInteger,NSUInteger,int的区别

引言: 咳咳,首先我是一枚资深小白(资深小白- -.也太衰),这个博客是自己用来记录迷糊犯二的东西. 最近发现难道是因为老了么(我明明18....),很多东西,脑子已经不记得了,迷迷糊糊,概念理论的东西脑子里面七零八落. 从一个知识点跳到另一个知识点,简直是连环事故. ??sad. 傲娇的我不服,决心要认认真真做好笔记,记录期间遇见的种种. 生活要有仪式感,学习应该也是要这样,作为Chapter 1 ,应该要起个好名字. 想了几十分钟,还是随便一些吧. 那就叫: OC成长之路 okok,来开始今

error: cast from ‘char*’ to ‘int’ loses precision

编译时出现错误:         error: cast from ‘char*’ to ‘int’ loses precision 原因:程序中存在 char* addrCom; addrCom= ......//赋值 if(-1 == (int)addrCom) //导致编译出错 { ...... } 上面是隐式转换,将其改为标准C++显示类型转换:static_cast<int>或这是reinterpret_cast<int> 依然是: error: cast from ‘c

const char*、char*、char* const、char[]、string的区别

1.const char* p: p is a pointer to const char(char const* p 一样)   意思就是不能通过p指针来修改p指向的内容(但是内容可以修改).2.char* p      : p is a pointer to char   意思就是可通过p指针来修改p指向的内容3.char* const p: p is a const pointer to char   意思就是p指针是一个常指针,他指向的内存地址不能变,定义的时候就得初始化   一旦给指针

MYSQL, char 与 varchar的区别!

一.char 和 varchar 的区别: 1)取值范围: char:取值范围:0~255 varchar:取值范围:0~65535 2)空间占用与速度: char: 定长字符串,占用空间大,速度快,一般用于固定长度的表单提交数据存储,例如:身份账号.电话号码.密码等 varchar:变长字符串,占用空间小,速度慢 3)存储与检索数据: char:存储的数据是否达到了给定值得字节,都要占用给定值大小的空间,不足的自动用空格填充,在检索时后面的空格会被自动去裁剪掉. 如:定义  tel char(