0x490049为什么只能把后一个49转成ASCII码输出出来

sh13661847134 2019-10-08 11:12:30
#include<iostream>
#include<string>
#include<stdlib.h>

using namespace std;

int main(void){
int a1=49;
int a2=0x49;
int a3=490049;
int a4=0x490049;
string s1,s2,s3,s4;
s1=a1;
s2=a2;
s3=a3;
s3=a4;
cout << "a1=49————:"<< s3 << endl;
cout << "a1=0x49————:"<< s3 << endl;
cout << "a1=490049————:"<< s3 << endl;
cout << "a1=0x490049————:"<< s3 << endl;
//16转2转10转ASCII

int a5=0x0049;
string s5;
s5=a5;
cout << "s5=0x5149————:" << s5 << endl;

/* string s6="O";
int a6=atoi(s6.c_str());
cout << a6 << endl;
*/
return 0;
}
...全文
678 39 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_39850486 2019-10-26
  • 打赏
  • 举报
回复
整数给字符串是什么操作,自己做赋值重载了吗?
qq_40766616 2019-10-13
  • 打赏
  • 举报
回复
。。。。。。。
blackpointer 2019-10-12
  • 打赏
  • 举报
回复
你看看内存中的排列顺序
red-fly 2019-10-12
  • 打赏
  • 举报
回复
引用 36 楼 sh13661847134 的回复:
对的 这个只是测试一下 不过实际开发过程中因为用到QT环境的 所以存字符串一般用QString 因为收发数据一般形参需要QString 然后还涉及到位操作那一块 就比较迷

QString不是问题,像我上面的那样,用char*处理好之后,转换成QString就可以了
sh13661847134 2019-10-11
  • 打赏
  • 举报
回复
引用 35 楼 red-fly 的回复:
[quote=引用 34 楼 sh13661847134 的回复:]
[quote=引用 33 楼 red-fly 的回复:]
int a1=49;
int a2=0x49;
int a3=490049;
int a4=0x490049;
string s1,s2,s3,s4;
s1=a1;
s2=a2;
s3=a3;
s3=a4;

不知道楼主这是要做什么,你直接把整数付给字符串变量,如果不是纯粹为了研究内存的分配,就没啥好说的,不管你是故意这样写的还是误写的,这都不是好的做法。如果你确实要用,那就用正常的写法,尽量使用不会有争议的写法,未来的维护也会容易得多,你一旦使用了特别的技巧,除非你能确定你在做什么,否则就不建议去用那些奇怪的写法
不是啊 发送上行帧的时候用int存16进制位,然后用QString拼接哇 不然怎么发上行帧啊[/quote]

那就要改变思路。
1. 要先确定你发送的是否是字符串,如果是字符串,那中间的0肯定会导致后面的数据被截取掉
2. 发送的不管是否字符串,上面的写法都是很不好的,应该使用char[]来保存你要发送的数据,比如
char buf[256] = {0};
int offset = 0;
memcpy(buf, &a1, sizeof(int));
offset += sizeof(int);
memcpy(buf + offset, &a2, sizeof(int));
offset += sizeof(int);
memcpy(buf + offset, &a3, sizeof(int));
offset += sizeof(int);
memcpy(buf + offset, &a4, sizeof(int));
offset += sizeof(int);
最后发送的数据就是buf,长度就是offset了。
如果你能确定发送的全部都是字符串,那就可以 string s1 = buf;

如果你要发送16进制的内容,比如你的 a4,你实际要发送的是字符串“490049”,那你上面的写法就是完全错误的了,应该改成如下的样子:
sprintf(buf, "%08X", a4);
s4 = buf;
这样,实际发送的是 “49004900”[/quote]对的 这个只是测试一下 不过实际开发过程中因为用到QT环境的 所以存字符串一般用QString 因为收发数据一般形参需要QString 然后还涉及到位操作那一块 就比较迷
red-fly 2019-10-11
  • 打赏
  • 举报
回复
引用 34 楼 sh13661847134 的回复:
[quote=引用 33 楼 red-fly 的回复:]
int a1=49;
int a2=0x49;
int a3=490049;
int a4=0x490049;
string s1,s2,s3,s4;
s1=a1;
s2=a2;
s3=a3;
s3=a4;

不知道楼主这是要做什么,你直接把整数付给字符串变量,如果不是纯粹为了研究内存的分配,就没啥好说的,不管你是故意这样写的还是误写的,这都不是好的做法。如果你确实要用,那就用正常的写法,尽量使用不会有争议的写法,未来的维护也会容易得多,你一旦使用了特别的技巧,除非你能确定你在做什么,否则就不建议去用那些奇怪的写法
不是啊 发送上行帧的时候用int存16进制位,然后用QString拼接哇 不然怎么发上行帧啊[/quote]

那就要改变思路。
1. 要先确定你发送的是否是字符串,如果是字符串,那中间的0肯定会导致后面的数据被截取掉
2. 发送的不管是否字符串,上面的写法都是很不好的,应该使用char[]来保存你要发送的数据,比如
char buf[256] = {0};
int offset = 0;
memcpy(buf, &a1, sizeof(int));
offset += sizeof(int);
memcpy(buf + offset, &a2, sizeof(int));
offset += sizeof(int);
memcpy(buf + offset, &a3, sizeof(int));
offset += sizeof(int);
memcpy(buf + offset, &a4, sizeof(int));
offset += sizeof(int);
最后发送的数据就是buf,长度就是offset了。
如果你能确定发送的全部都是字符串,那就可以 string s1 = buf;

如果你要发送16进制的内容,比如你的 a4,你实际要发送的是字符串“490049”,那你上面的写法就是完全错误的了,应该改成如下的样子:
sprintf(buf, "%08X", a4);
s4 = buf;
这样,实际发送的是 “49004900”
sh13661847134 2019-10-11
  • 打赏
  • 举报
回复
引用 33 楼 red-fly 的回复:
int a1=49;
int a2=0x49;
int a3=490049;
int a4=0x490049;
string s1,s2,s3,s4;
s1=a1;
s2=a2;
s3=a3;
s3=a4;

不知道楼主这是要做什么,你直接把整数付给字符串变量,如果不是纯粹为了研究内存的分配,就没啥好说的,不管你是故意这样写的还是误写的,这都不是好的做法。如果你确实要用,那就用正常的写法,尽量使用不会有争议的写法,未来的维护也会容易得多,你一旦使用了特别的技巧,除非你能确定你在做什么,否则就不建议去用那些奇怪的写法
不是啊 发送上行帧的时候用int存16进制位,然后用QString拼接哇 不然怎么发上行帧啊
red-fly 2019-10-11
  • 打赏
  • 举报
回复
int a1=49;
int a2=0x49;
int a3=490049;
int a4=0x490049;
string s1,s2,s3,s4;
s1=a1;
s2=a2;
s3=a3;
s3=a4;

不知道楼主这是要做什么,你直接把整数付给字符串变量,如果不是纯粹为了研究内存的分配,就没啥好说的,不管你是故意这样写的还是误写的,这都不是好的做法。如果你确实要用,那就用正常的写法,尽量使用不会有争议的写法,未来的维护也会容易得多,你一旦使用了特别的技巧,除非你能确定你在做什么,否则就不建议去用那些奇怪的写法
optimistic zc 2019-10-10
  • 打赏
  • 举报
回复
...................
weixin_45731742 2019-10-10
  • 打赏
  • 举报
回复
顶顶顶顶淡淡的
a5322159 2019-10-10
  • 打赏
  • 举报
回复
求1个积分多谢多谢了,大家帮个忙,谢谢了啊 求求求!!!!
XiongYoJa 2019-10-10
  • 打赏
  • 举报
回复
引用 1 楼 sh13661847134的回复:
小端机 0x0049输出了个I 那为什么0x490049只能输出1个I 而不是I I,00居然代表的是空 为啥从int转成string之后 只能取最后两位49了呢。。。请教一下各位大佬
ASCLL表中00就是Null吧!
cream123 2019-10-09
  • 打赏
  • 举报
回复
33
13
2
2
2
2.
  • 打赏
  • 举报
回复
引用 23 楼 SuperDay 的回复:
00只有在字符串里面才是结束符,在整数里面不算
是的,我糊涂了。
  • 打赏
  • 举报
回复
引用 22 楼 sh13661847134 的回复:
所以为什么0x490049不是I I呢如果是截断的话 那为什么0x5149不是IQ。。只有一个I
因为0x490049在放到string里面之前会转换成char类型,一个char类型只能放一个字节,也就是两位16进制数,所以只能放进去一个49。 如果你转换成char*倒是可以放一堆,但是由于存在字符00所以,同样也是不完整。
铖邑 2019-10-09
  • 打赏
  • 举报
回复
引用 5 楼 zjq9931 的回复:
[quote=引用 3 楼 sh13661847134 的回复:] [quote=引用 2 楼 kuangbao9的回复:]截断了,ASCII码是byte类型
为啥会被截断呀 还有就是00在16进制中起到什么作用啊[/quote] 00表示字符串的结束啊。[/quote]00只有在字符串里面才是结束符,在整数里面不算
sh13661847134 2019-10-09
  • 打赏
  • 举报
回复
引用 19 楼 SuperDay的回复:
[quote=引用 18 楼 gouyanfen 的回复:] [quote=引用 17 楼 SuperDay 的回复:] 看来你们都是死读书读死书啊。一个个都钻到char*出不来了,为什么会是char*呢?完全没有根据嘛 string (1) string& operator+= (const string& str); c-string (2) string& operator+= (const char* s); character (3) string& operator+= (char c); 请注意最后一个,char这个参数,a1 a2 a3 a4不管哪一个最后都到char去了,结果都被截断了,于是最后不是49,就是x49。这不是显而易见的吗?讨论了一个下午没结果
string 的int operator =也可以重载啊,为什么就一定是你说的答案呢?结果就一定会被截断吗,不见得吧[/quote] 重载什么重载,自己看手册: http://www.cplusplus.com/reference/string/string/operator=/[/quote] 所以为什么0x490049不是I I呢如果是截断的话 那为什么0x5149不是IQ。。只有一个I
SanHgu 2019-10-09
  • 打赏
  • 举报
回复
引用五楼的话那个byte类型
侠客行杯莫停 2019-10-09
  • 打赏
  • 举报
回复
挺好的,很实用
铖邑 2019-10-08
  • 打赏
  • 举报
回复
你要看string赋值能接受什么样的数据类型,如果只有char,那么这些int在赋值之前全部被转化成char,那么高位都会被截去
加载更多回复(20)

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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