字符数组问题,谢谢
#include <iostream>
#include <string>
using namespace std;
intmain(){
char a="abedu";
cout << "&a=="<<&a<< endl;
cout << "*&a=="<<*&a<< endl;
cout << "&a=="<<&a<< endl;
cout << "*(&a)=="<<*(&a)<< endl;
cout << "(unsigned int*)a=="<<(unsigned int*)a<< endl;
cout << "*((unsigned int*)a)=="<<*((unsigned int*)a)<< endl;
return 0;
}
经测试 &a 和 (unsigned int*)a的 值 是 相等的,但为何 对 两者解引用的 结果 不同呢?
*&a 是个 字符串
*((unsigned int*)a)却是个 常数。
谢谢 强制转换后只会取出第一个int值 就如同int a;一样,int 也能被其它的修饰符修饰。除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种:
1.signed----有符号,可修饰char、int。Int是默认有符号的。
2.unsigned-----无符号,修饰int 、char
3.long------长型,修饰int 、double
4.short------短型,修饰int
我们主要来看一下signed和unsigned与int之间的联系与区别。
什么叫做有符号,什么叫做无符号
这个问题其实很简单,比如:5和-5,5没有符号,-5有符号。简单吧。但是在计算机中的这种符号可不简单。我们分别来看一下:
在说明有符号和无符号的区别之前,我们必须先知道溢出是怎么回事,因为有无符号的根本原因可以说就是因为数据出现了溢出现象导致的。
溢出:
我们知道数据在计算机中以二进制存储,并且占据一定的空间,而这个空间属于计算机分配的空间。
计算机给int分配32位或者16位(不同电脑可能不同)的空间,既然空间有限,那么数值就会有限制,就会存在最大值与最小值这一说,比如:假设int类型的分配16位,无符号类型的最大值为1111 1111 1111 1111(16个1),也就是65535,如果超过了65535,这就叫做溢出,那该怎么办? 如果要输出65536,那将会输出个什么东西呢? 下面和大家一起看一下:
疑问:有的读者会问:65535这么小啊,我记得自己在输出比65535大好多的数也能够输出啊。
解答: 那就是有无符号的定义和你电脑编译器的原因了。64位的电脑和32的电脑可是不一样的哦。而且int占几个字节是与电脑编译器有关的。不过现在大部分电脑int占4个字节,即32位,那么他的最大值可是32个1(二进制)左右的数量级,你实验过这么大的数吗?
1.无符号整型(unsignedint)
(1)我们都知道整型是4个字节(有些编译器不同,可能会是2个),即32位,无符号整型当然也为32位。
(2)既然是32位,无符号整型的取值是32个0~32个1,即:0~4294967295
(3) 我们举个例子:32位有点长,所以我们拿16位的unsigned short int 来举例。
short int 是16位的,无符号的范围是0~65535
就拿十进制的32767(以下的所有举例均拿这个数字来说事了)来说,它的二进制为:
0111 1111 1111 1111
对于无符号的整型32767来说,它的二进制的最高位称为数据位,即那个0就是数据位,数据位是要参与运算的,如果我们把0改成1,即16个1,它的十进制就是65535(就是2的15次方+2的14次方...一直加到2的0次方),这是不同于有符号整型的。 记得采纳哦 AmosAlbert 发表于 2019-7-16 17:37
记得采纳哦
你说了这么多,我还是看不出哪里回答我的问题了{:5_90:} BngThea 发表于 2019-7-16 16:44
强制转换后只会取出第一个int值
可是第一个字符数组a[]的第一个字符'a'转换成的数字也只有97而已,但*((unsigned int*)a)的结果1684365921啊 dt3tc 发表于 2019-7-17 06:59
你说了这么多,我还是看不出哪里回答我的问题了
学多了你自然就理解了 dt3tc 发表于 2019-7-17 07:02
可是第一个字符数组a[]的第一个字符'a'转换成的数字也只有97而已,但*((unsigned int*)a)的结果168436592 ...
它是个随机数,没什么关联 嘻嘻嘻,谢谢将我设置为最佳答案,鱼c有你更精彩
我这里没什么问题 虽然是用c写的
页:
[1]