char数组如何强制转换为int类型?

排山和倒海 2014-07-22 10:17:37
char a[4] = {0,0,1,1};
我们知道char是一个字节,int是4个(一般32位),如果把含有4个char的数组转换为int类型呢
如上结果,转换为int以后,我想要的结果是
257 = 1*2^8+1

...全文
15969 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-07-22
  • 打赏
  • 举报
回复
char a[4] = {0,0,1,1};
int i;
char *p;
i=1;
p=(char *)&i;
if (p[0]==1) {//小端
 p[0]=a[3];p[1]=a[2];p[2]=a[1];p[3]=a[0];
} else {//大端
 p[0]=a[0];p[1]=a[1];p[2]=a[2];p[3]=a[3];
}
printf("%d\n",i);//257
lm_whales 2014-07-22
  • 打赏
  • 举报
回复
关于7楼:

- 1610481664 = 0xA0020000
00          00          02            A0 
00000000(0),00000000(0),00000010(0),10100000(160)
这是Intel 格式 ,低字节在低地地址,高字节在高地址。

大小端是字节序的格式,其实就是Intel 和 Motolola 两种格式的分别。
X86下,DOS,Windows 是 Intel 格式。

TIFF文件 用 II,MM 来区分文件的字节序
II是 Intel 格式,MM是Motolola格式。
所以TIFF格式文件无论大小端,都是可以识别的。

至于大小端本身,我似乎看到两种说法
一种说  Intel 格式是小端。
一种说  Intel 格式是大端。
所以大小端这个,我真不知道,应该认可哪一种说法。
这个大小端,只有请大神们来确认一下了。
f27ny105t5123 2014-07-22
  • 打赏
  • 举报
回复
引用 12 楼 f27ny105t5123 的回复:
记得在书上看到过一个聪明方法,当时印象很深刻,你看看行不行
union atoi
{
	char a[4];
	int x;	
};
就用上面这个联合体定义一个变量就好,直接使用x就可以了。另外,注意下应该char[0]是最高位
另外注意下符号位。。。。
f27ny105t5123 2014-07-22
  • 打赏
  • 举报
回复
记得在书上看到过一个聪明方法,当时印象很深刻,你看看行不行
union atoi
{
	char a[4];
	int x;	
};
就用上面这个联合体定义一个变量就好,直接使用x就可以了。另外,注意下应该char[0]是最高位
排山和倒海 2014-07-22
  • 打赏
  • 举报
回复
谢谢大神们,我自己看了一下,果然是因为我这个是小端存储的,然后-1610481664这个结果通过万能的计算器也是可以查看的
11111111 11111111 11111111 11111111 10100000 00000010 00000000 00000000
谢谢,结贴了
发一个图,对于0x12345678

排山和倒海 2014-07-22
  • 打赏
  • 举报
回复
引用 6 楼 lm_whales 的回复:
最简单,最本分,不会出错的做法是,一个字节一个字节的计算。 a[3] + a[2] * 256 + a[1] * 256 * 256 + a[0] * 256 * 256 * 256 乘法可以改成移位实现 如果直接把数组,当作整型数据使用,有个字节序问题(大小端)问题,所以不能移植。
谢谢你的回答,麻烦看一下7楼哈
排山和倒海 2014-07-22
  • 打赏
  • 举报
回复
引用 5 楼 baichi4141 的回复:
如果内存存储是小端,则int x = a[0] + a[1]*256 + a[2]*65536 + a[3]*16777216; 如果内存存储是大端,则int x = a[3] + a[2]*256 + a[1]*65536 + a[0]*16777216;
谢谢你的回答,麻烦看一下7楼哈
loong0306 2014-07-22
  • 打赏
  • 举报
回复
char输出了以后不就是转换以后的了嘛。是不是应该int额。 感觉应该先给他们转换为二进制,然后相加后的初始值改变后相加
128 64 32 16 8 4 2 1 
32768 16384 8192 4096 2048 1024 512 256
排山和倒海 2014-07-22
  • 打赏
  • 举报
回复
引用 4 楼 lin5161678 的回复:
不考虑大小端 可以直接memcpy memmove 把数据赋值进int ps 所谓的i = *(int*)a 这样的做法是错的
谢谢哈,说出了问题,我把分数再提高一些,你们都说对了,我现在是想知道我这个知道是大端还是小端啊 这里我的char数组,是,00000000(0),00000000(0),00000010(0),10100000(160) 然后我强制转换为int后,按int value = *((int*) (ppBytes + currentlen)); 这个方法,得出的结果是,-1610481664
lm_whales 2014-07-22
  • 打赏
  • 举报
回复
最简单,最本分,不会出错的做法是,一个字节一个字节的计算。 a[3] + a[2] * 256 + a[1] * 256 * 256 + a[0] * 256 * 256 * 256 乘法可以改成移位实现 如果直接把数组,当作整型数据使用,有个字节序问题(大小端)问题,所以不能移植。
baichi4141 2014-07-22
  • 打赏
  • 举报
回复
如果内存存储是小端,则int x = a[0] + a[1]*256 + a[2]*65536 + a[3]*16777216; 如果内存存储是大端,则int x = a[3] + a[2]*256 + a[1]*65536 + a[0]*16777216;
lin5161678 2014-07-22
  • 打赏
  • 举报
回复
不考虑大小端 可以直接memcpy memmove 把数据赋值进int ps 所谓的i = *(int*)a 这样的做法是错的
排山和倒海 2014-07-22
  • 打赏
  • 举报
回复
我按帖子 http://bbs.csdn.net/topics/80399657 好像不行啊 int value = *((int*) (ppBytes + currentlen));
排山和倒海 2014-07-22
  • 打赏
  • 举报
回复
引用 1 楼 ouyh12345 的回复:
和大小端有关系 atoi
谢谢你的回答,你可能误解我了 我其实最想要的就是把4个char数组,强制转换为1个int,你说的那个atoi是将char数组表示的数字字符转换为int类型。 我说的是 2进制上的转换 比如char数组,00000000,00000000,00000001,00000001 转换为int后就是,00000000 00000000 00000001 00000001 = 257
ouyh12345 2014-07-22
  • 打赏
  • 举报
回复
和大小端有关系 atoi

64,654

社区成员

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

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