为什么char类型变量赋值字符时不带\也可以进行计算?

sako.c 2019-09-27 01:01:01
前者为带\的,后为不带\的,详情见图
...全文
616 43 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
陈柏祁 2019-10-05
  • 打赏
  • 举报
回复
我不是质问,是真不懂……
yudigital 2019-10-01
  • 打赏
  • 举报
回复
一个语言设计上的bug,
赵4老师 2019-09-29
  • 打赏
  • 举报
回复
电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
sako.c 2019-09-29
  • 打赏
  • 举报
回复
我知道你的意思,我只不过是把最后那个00783332中读取32理解为了读取字符常量中‘x32’的2而已,都是溢出,所以是等价的吧。
李长歌丶 2019-09-29
  • 打赏
  • 举报
回复
\表示8进制 \x表示16进制 你把32化成十六进制就是20但是你只开辟一个单位那就只能输出2了
曹敏亚 2019-09-29
  • 打赏
  • 举报
回复
高端的技术,这种教程可以的哦!
七幻 2019-09-28
  • 打赏
  • 举报
回复
'\x32'表示转义字符,也就是16进制的32,对应十进制就是50,也就是c的值是50
sako.c 2019-09-28
  • 打赏
  • 举报
回复
引用 34 楼 ~稻草人~的回复:
字符常量,看到这词,心里一慌,还真没想过和字符变量的区别,百度了一轮,大家讨论讨论 如: char t='a'; 1:t 是字符变量, 运行内存中的占用1字节; 2:'a' 是字符常量,不占运行内存,但在代码存储空间中占4个字节。 然后,理解一下楼主问题: 1:a,063,0开头,8进制数,赋给a就是51; 2:b,'A',字符常量,赋给b的是低8位,是65; 3:c,'\x32',转义字符,4位字符常量,赋给c时也是低8位,即16进制的32,是50。 至于c的反斜杠有没有的问题,应该和3的意思一样。也没查到相应解释。
那个没有反斜杠的解释我整理了以上大佬们的意见,我觉得也是编译器直接就是把x32这三ASCII码当成字符常量而不是转义字符来处理,因为我并没有加\,所以不可能会是转义字符,而当成字符常量来处理的话,因为这里有三个字符常量,所以说是三个字节,但char c 中的c只有一个字节,因此输出的时候也只能输出一个字节,按照我的理解,编译器按照从小到大(这里也就是重后往前先读取2再读取3在读取x)的顺序读取并显示,因此显示了字符‘2’的值,与‘\x32’的值相同这里是纯属巧合。。。。 嘛,应该就是这样吧,,,,,感谢大家了!!!
sako.c 2019-09-28
  • 打赏
  • 举报
回复
引用 33 楼 shw014的回复:
一个 字节的范围 是 0-255 用16进制表示需要2个字符
用十六进制的两位数来表示一个ASCII码我搞懂了,现在我最后一个问题是他这个显示数据是从最后一位ASCII码开始读取的嘛?我的理解是按照从数的底位向高位读取,也就是比如123,是从3开始读取并显示的,这么这样就说的通了,不知道对不对QAQ
7.83Hz 2019-09-28
  • 打赏
  • 举报
回复
字符常量,看到这词,心里一慌,还真没想过和字符变量的区别,百度了一轮,大家讨论讨论 如: char t='a'; 1:t 是字符变量, 运行内存中的占用1字节; 2:'a' 是字符常量,不占运行内存,但在代码存储空间中占4个字节。 然后,理解一下楼主问题: 1:a,063,0开头,8进制数,赋给a就是51; 2:b,'A',字符常量,赋给b的是低8位,是65; 3:c,'\x32',转义字符,4位字符常量,赋给c时也是低8位,即16进制的32,是50。 至于c的反斜杠有没有的问题,应该和3的意思一样。也没查到相应解释。
无形有道 2019-09-28
  • 打赏
  • 举报
回复
引用 25 楼 sako.c 的回复:
[quote=引用 16 楼 lin5161678的回复:]溢出了而已
'x32' 的数值是实现定义 常见实现是 0x00783332 十进制7877426
你的代码是 char c = 7877426;

我试了,的确,如果直接printf(“%d”,‘x32’)的结果是7877426,但如果你定义char c=‘x32’,在输出c的话,就是50,也就是和printf(“%d”,‘\x32’)的结果相同[/quote]

楼主,16楼才是正解。char c = (char)(int)0x00783332 = 0x32 = 50 = '2'; 只不过从'int' to 'char'转换时溢出了而已
shw014 2019-09-28
  • 打赏
  • 举报
回复
一个 字节的范围 是 0-255 用16进制表示需要2个字符
Mapleas 2019-09-28
  • 打赏
  • 举报
回复
引用 30 楼 qq_35806826 的回复:
[quote=引用 26 楼 Mapleas的回复:][quote=引用 24 楼 qq_35806826 的回复:] [quote=引用 14 楼 Mapleas的回复:]字符常量可以占4个字节,你输入'x32'后在内存中就是32 33 78 00,然后取第一个值就是32 = '2'
额,你这解释我看不懂啊。。。还有那个50的值应该怎么解释呢? 其实我就是想知道是不是char类型字符常量是不是不用加\也能运行[/quote] x对应16进制78,'2'对应16进制32,'3'对应16进制33,放到内存中就是32 33 78 00,因为char字符占1个字节,所以只读取1个字节的数据,32. 32是16进制对应10进制是50所以你第一个c是50,50对应的ascii是2,所以你第二个c是'2'[/quote] 嗯,大部分我懂了,但是我运行printf(“%x”,‘x32’)出来的结果是783332,好像正好跟你说的相反。。。。而且为什么最高只能显示出8位数呢?比如‘x3zz’就输出的是78337a7a,是一个字节就只占两位吗?[/quote] 你需要学习下大小端,16进制,以及数据类型所占字节的知识
shw014 2019-09-28
  • 打赏
  • 举报
回复
C语言中%X的意思是以十六进制数形式输出整数
sako.c 2019-09-28
  • 打赏
  • 举报
回复
引用 26 楼 Mapleas的回复:
[quote=引用 24 楼 qq_35806826 的回复:] [quote=引用 14 楼 Mapleas的回复:]字符常量可以占4个字节,你输入'x32'后在内存中就是32 33 78 00,然后取第一个值就是32 = '2'
额,你这解释我看不懂啊。。。还有那个50的值应该怎么解释呢? 其实我就是想知道是不是char类型字符常量是不是不用加\也能运行[/quote] x对应16进制78,'2'对应16进制32,'3'对应16进制33,放到内存中就是32 33 78 00,因为char字符占1个字节,所以只读取1个字节的数据,32. 32是16进制对应10进制是50所以你第一个c是50,50对应的ascii是2,所以你第二个c是'2'[/quote] 嗯,大部分我懂了,但是我运行printf(“%x”,‘x32’)出来的结果是783332,好像正好跟你说的相反。。。。而且为什么最高只能显示出8位数呢?比如‘x3zz’就输出的是78337a7a,是一个字节就只占两位吗?
  • 打赏
  • 举报
回复
编译器的问题。现在新的编译器越来越先进了。
六道佩恩 2019-09-28
  • 打赏
  • 举报
回复
C语言里变量分哪些类型 分整型和浮点型(也就是小数),如int和double 分有符号型和无符号型,即signed和unsigned 分动态和静态,auto和static 分局部和全局,这是作用域 char是有符号型的整型变量,也就是缩小型的int,你用int一样可以,比如 int a = 'A'; printf("%c", a ); 因为单引号括起来的字符本质上就是一个数字,'A'就是65,你这样效果也一样 int a = 65; printf("%c", a ); 既然你知道char是整型了,那么整型能怎么用它就能怎么用,比如 char a=2, b=3; char c= a*b; printf("c=%d", c );
白錵錵 2019-09-27
  • 打赏
  • 举报
回复
编译器的处理方法问题,因为在char赋值时是用的单引号,c语言中单引号是表示字符的,多个字符这样赋值书写肯定是有问题的,编译器解析时帮你处理了,就少了一个bug
Mapleas 2019-09-27
  • 打赏
  • 举报
回复
引用 24 楼 qq_35806826 的回复:
[quote=引用 14 楼 Mapleas的回复:]字符常量可以占4个字节,你输入'x32'后在内存中就是32 33 78 00,然后取第一个值就是32 = '2'
额,你这解释我看不懂啊。。。还有那个50的值应该怎么解释呢? 其实我就是想知道是不是char类型字符常量是不是不用加\也能运行[/quote] x对应16进制78,'2'对应16进制32,'3'对应16进制33,放到内存中就是32 33 78 00,因为char字符占1个字节,所以只读取1个字节的数据,32. 32是16进制对应10进制是50所以你第一个c是50,50对应的ascii是2,所以你第二个c是'2'
sako.c 2019-09-27
  • 打赏
  • 举报
回复
引用 16 楼 lin5161678的回复:
溢出了而已 'x32' 的数值是实现定义 常见实现是 0x00783332 十进制7877426 你的代码是 char c = 7877426;
我试了,的确,如果直接printf(“%d”,‘x32’)的结果是7877426,但如果你定义char c=‘x32’,在输出c的话,就是50,也就是和printf(“%d”,‘\x32’)的结果相同
加载更多回复(24)

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧