Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在比较中是否将字符转换为整数?_C++_Pointers - Fatal编程技术网

C++ 在比较中是否将字符转换为整数?

C++ 在比较中是否将字符转换为整数?,c++,pointers,C++,Pointers,我试图理解下面的比较语句中发生了什么 int n = 1; std::puts( ((char*)&n)[0] == 1 ? "-Y-" : "-N-" ); 上述语句对我的输出是-Y- 我的第一个问题是,为什么将指针转换为char*而不是int* 此外,如果我们将字符与int进行比较,答案似乎应该是-N- 当与1进行比较时,字符是否会自动转换为int?这是一些可怕的代码,但它输出-Y-的原因是因为您将intn的内容有效地视为字节数组,机器的字节顺序是这样的,它以与char[]={1

我试图理解下面的比较语句中发生了什么

int n = 1;

std::puts( ((char*)&n)[0] == 1 ? "-Y-" : "-N-" );
上述语句对我的输出是
-Y-

我的第一个问题是,为什么将指针转换为
char*
而不是
int*

此外,如果我们将字符与int进行比较,答案似乎应该是
-N-


当与
1
进行比较时,字符是否会自动转换为int?

这是一些可怕的代码,但它输出
-Y-
的原因是因为您将int
n
的内容有效地视为字节数组,机器的字节顺序是这样的,它以与
char[]={1,0,0}相同的方式存储
int=1
的值(不要依赖于此!)

所以这就像你在做的一样

int someInt = 1;
char someChar = 1;
if (someInt == someChar)
{
  puts("-Y"-):
}
else
{
  puts("-N"-):
}

回答第二个问题(和标题问题),是的C++(和C)隐式做类型推广:参见

这是一些可怕的代码,但是它输出<代码> -y/<代码>的原因是因为你有效地将int(代码)> n>代码>的内容作为字节数组来处理,机器的字节顺序是这样的,它以与
char[]={1,0,0}相同的方式存储
int=1
的值(不要依赖于此!)

所以这就像你在做的一样

int someInt = 1;
char someChar = 1;
if (someInt == someChar)
{
  puts("-Y"-):
}
else
{
  puts("-N"-):
}

< >回答第二个问题(标题题),是的C++(和C)将隐式做类型推广:参见

答案取决于“种子”:

>>> struct.pack('<i', 1)
'\x01\x00\x00\x00'
>>> struct.pack('>i', 1)
'\x00\x00\x00\x01'
结构包('i',1) “\x00\x00\x00\x01”

-Y-
对应于小尾端字节顺序。

答案取决于尾端的大小:

>>> struct.pack('<i', 1)
'\x01\x00\x00\x00'
>>> struct.pack('>i', 1)
'\x00\x00\x00\x01'
结构包('i',1) “\x00\x00\x00\x01”

-Y-
对应于小尾端字节顺序。

您可以将字符与int进行比较,但这里的字符值是多少?你不能仅仅从你发布的代码中分辨出来,在不同的环境中可能会有所不同


您不是将字符转换为int并进行比较,而是将int的一部分切掉,将其视为一个字符,然后升级并进行比较。在小端机器上可能是1,在大端机器上可能是0。

您可以将字符与int进行比较,但这里的字符值是多少?你不能仅仅从你发布的代码中分辨出来,在不同的环境中可能会有所不同


您不是将字符转换为int并进行比较,而是将int的一部分切掉,将其视为一个字符,然后升级并进行比较。在小端机上可能是1,在大端机上可能是0。

这段代码是从哪里来的?我的眼睛!护目镜没用!代码来自glassdoor.com。这应该是谷歌求职面试中提出的一个问题。
char
实际上是一个数字类型。你从哪里得到这个代码的?我的眼睛!护目镜没用!代码来自glassdoor.com。这应该是谷歌求职面试中提出的一个问题。
char
实际上是一种数字类型。因此,表示小尾端整数1的“char”字节数组是
char[]={1,0,0,0,0,0,0,0}
而对于大尾端
char[]={0,0,0,0,0}
。正确吗?@davewise对于64位整数(8字节),您的小尾端看起来正确是的-但大尾端都是0?如果最后一个元素是1,那就对了。还有一个问题。(也许这应该是一个新话题?)字节顺序和位顺序通常是同时进行的吗?换句话说,如果字节顺序是big-endian,那么位顺序也是big-endian吗?@davewise是个好问题,但是位的endian性并不是你真正需要担心的事情-它通常是透明的,因为你通常无法寻址单个位-所以代表小endian的整数1的“char”字节数组是
char[]={1,0,0,0,0,0,0,0}
对于big-endian
char[]={0,0,0,0,0,0,0,0}
。正确吗?@davewise对于64位整数(8字节),你的小endian看起来是正确的-但是big-endian都是0?如果最后一个元素是1,那就正确了。还有一个问题。(也许这应该是一个新主题?)字节顺序和位顺序通常是齐头并进的吗?换句话说,如果字节顺序是big-endian,那么位顺序也是big-endian吗?@davewise问得好,但位endian并不是你真正需要担心的事情-它通常是透明的,因为你通常无法处理单个位-参见