吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1376|回复: 11
收起左侧

[求助] C语言中char类型的数据'abc'、'\abc'、'\a\bc'三个的值为什么会这样?

[复制链接]
你不会了解 发表于 2021-11-5 12:11
本帖最后由 你不会了解 于 2021-11-5 14:58 编辑

[C] 纯文本查看 复制代码
#include <stdio.h>

int main(void)
{
	char ch1 = 'abc';
	char ch2 = '\abc';
	char ch3 = '\a\bc';

	printf("%c %d\n", ch1, ch1);	// c	99
	printf("%c %d\n", ch2, ch2);	// c	99
	printf("%c %d\n", ch3, ch3);	//      7}


上述三个变量,ch1和ch2分别保存的是c的二进制值

我理解的是,这两变量按小端模式存储,实际要反着来

如'cba','cb\a',又因char只能存一个字节,所以保存的是c

但是为什么ch3保存的是\a的值,也就是7,为什么?

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

xinyu010 发表于 2021-11-5 13:16
在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如,像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示 [2]  。
god4 发表于 2021-11-5 13:29
mzq123000 发表于 2021-11-5 13:59
PirateMan 发表于 2021-11-5 14:05
至于大端和小端和CPU有关   只能保存一个字节    对应的是ASCII码
weakptr 发表于 2021-11-5 14:08
https://en.cppreference.com/w/cpp/language/character_literal

针对你的问题:
1,多字符的char字面量('abc'),储存类型是`int`,值是实现定义的
2,假设'abc'实现定义是小端序4字节int,则 int 保存的值是`0x00616263`(内存中是`63626100`),根据c的舍入规则,取低位1字节,是'c',也就是0x63.

针对你的案例代码,我特地还用 gcc 和 clang 试了一下:

[C] 纯文本查看 复制代码
#include <stdio.h>

int main(void) {
  printf("%08x %02x", '\a\bc', (char)'\a\bc');
  return 0;
}


结果是 00070863 63

你说输出 \a 的话我建议你再检查下你的案例代码是怎么写的,
wuai习 发表于 2021-11-5 14:37
char ch1 = 'abc';
int ch = 'abc';//6382179
//01100001 01100010 01100011,
//97 98 99
//ASCII码:a b c

char ch2 = '\abc';
int ch5 = '\abc';//483939
//0111 01100010 01100011
//7 98 99
//ASCII码:\a b c

char ch3 = '\a\bc';
int ch6 = '\a\bc';//6490119
//01100011 00001000 00000111,
//99 8 7
//ASCII码:c \b \a
wuai习 发表于 2021-11-5 14:40
wuai习 发表于 2021-11-5 14:37
[md]```cpp
char ch1 = 'abc';
int ch = 'abc';//6382179

编译器提醒:“初始化”: 从“int”到“char”截断
重新定义int变量看了一下它的值,转化为二进制,实际就是这样存储的
 楼主| 你不会了解 发表于 2021-11-5 14:45
weakptr 发表于 2021-11-5 14:08
https://en.cppreference.com/w/cpp/language/character_literal

针对你的问题:

[C] 纯文本查看 复制代码
char ch1 = 'abc';
char ch2 = '\abc';
char ch3 = '\a\bc';
printf("%c %d\n", ch1, ch1);
printf("%c %d\n", ch2, ch2);
printf("%c %d\n", ch3, ch3);


就这么几行代码,写在main函数里,引入stdio头文件,其他没有

Win10,VS2019,Debug x64调试

最终输出结果(\a是警告提示,调试时听到声音了)

[Bash shell] 纯文本查看 复制代码
c 99
c 99
 7
DEATHTOUCH 发表于 2021-11-5 15:42
gcc的结果是

[Bash shell] 纯文本查看 复制代码
c 99
c 99
c 99

改一下你的代码
[C] 纯文本查看 复制代码
#include <stdio.h>

int main()
{
    int i1 = 'abc';
    int i2 = '\abc';
    int i3 = '\a\bc';
    printf("%c %x\n", i1, i1);
    printf("%c %x\n", i2, i2);
    printf("%c %x\n", i3, i3);
}

结果就是
[Bash shell] 纯文本查看 复制代码
c 616263
c 76263
c 70863

我觉得很明显了
估计msvc的操作不一样吧
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 20:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表