如果将int作为参数传递给接收字节(char)的方法,C/C++如何处理? int是否被截断?或者是其他东西?如果您将int传递给C中的字节参数,会发生什么?
例如:
void method1()
{
int i = //some int;
method2(i);
}
void method2(byte b)
{
//Do something
}
怎样的INT获得 “投” 到一个字节(一个字符)?它会被截断吗?
如果将int作为参数传递给接收字节(char)的方法,C/C++如何处理? int是否被截断?或者是其他东西?如果您将int传递给C中的字节参数,会发生什么?
例如:
void method1()
{
int i = //some int;
method2(i);
}
void method2(byte b)
{
//Do something
}
怎样的INT获得 “投” 到一个字节(一个字符)?它会被截断吗?
就截断,位模式(字节一般无符号的字符,但是,你必须检查)
INT I = -1;
变成
字节b = 255;当字节=无符号字符时
字节b = -1;当字节= signed char时
i = 0; b = 0;
i = 1024; b = 0;
i = 1040; b = 16;
有两种情况担心:
// Your input "int i" gets truncated
void method2(byte b)
{
...
// Your "method2()" stack gets overwritten
void method2(byte * b)
{
...
我不明白这个答案。问题中没有指针('byte *')。无论如何,为什么堆栈会被覆盖? – Celada 2012-04-06 19:21:59
如果byte
代表char
类型,行为将取决于是否char
在你的平台上带符号。
如果char
是无符号的,原int
值减小到unsigned char
范围模UCHAR_MAX+1
。 [0, UCHAR_MAX]
范围内的值将被保留。 C语言规范描述了这一过程如
...的值被重复地加上或减去小于能够在新的类型来表示,直到该值是在新的类型的范围的最大值多一个转换。
如果char
类型是有符号,然后[SCHAR_MIN, SCHAR_MAX]
范围内的值被保留下来,而在该范围之外的任何值在一些实现定义的方式被转换。 (C语言另外明确允许在这种情况下提高实现定义的信号)。没有普遍的答案。请咨询您的平台的文档。或者,更好的是,编写不依赖于任何特定转换行为的代码。
请注意,“char”无符号的情况下的规则等于将“int”值截断为二进制补码表示的较低“log_2(UCHAR_MAX + 1)”位。 – caf 2012-04-07 12:10:46
您不会告诉byte
是什么,但是如果您传递可转换为参数类型的参数,则该值将被转换。
如果类型具有不同的值范围,则存在该值超出参数类型范围的风险,则该值不起作用。如果它在范围内,它将是安全的。
它将被转换为一个字节,就像您明确转换为(byte)i
一样。
尽管上面的示例代码可能是不同的情况,除非您有未显示的method2
的前向声明。由于method2
在调用时尚未声明,因此编译器不知道其第一个参数的类型。在C中,函数在被调用之前应该被声明(或定义)。在这种情况下会发生什么是编译器假设(作为隐式声明)method2
的第一个参数是int
和method2
收到int
。正式的这会导致未定义的行为,但是在大多数体系结构中,无论如何,int
和byte
都将在相同大小的寄存器中传递,并且它会发生作用。
下面是一个例子:
1)代码:
#include <stdio.h>
void
method1 (unsigned char b)
{
int a = 10;
printf ("a=%d, b=%d...\n", a, b);
}
void
method2 (unsigned char * b)
{
int a = 10;
printf ("a=%d, b=%d...\n", a, *b);
}
int
main (int argc, char *argv[])
{
int i=3;
method1 (i);
method2 (i);
return 0;
}
2)编译(与警告):
$ gcc -o x -Wall -pedantic x.c
x.c: In function `main':
x.c:22: warning: passing arg 1 of `method2' makes pointer from integer without a cast
3)执行(与崩溃):
$ ./x
a=10, b=3...
Segmentation fault (core dumped)
'希望有所帮助 - 无论你的原产地问题以及相关问题。
引述C++ 2003标准:
条款5.2.2 paragrah 4:当一个函数被调用时,每个参数(8.3.5)须与其相应 初始化(8.5,12.8,12.1)论据。
所以,b
是与i
初始化。那是什么意思?
8.5/14被初始化的对象的初始值是初始化器 表达式的(可能转换的)值。如有必要,将使用标准转换(第4章)将初始化程序表达式 转换为...目标类型;没有用户定义的转换被认为是
噢,i
是转换,使用标准转换。那是什么意思?在许多其他标准转换是这些:
4.7/2如果目标类型是无符号的,所得到的值是至少无符号整数全等到源 整数(模2 Ñ其中n是数用来表示无符号类型的位)。如果目标类型是有符号的,如果它可以在目标类型中表示(并且位宽为 ),则值不变。否则,该值是实现定义的。
哦,所以如果char
是无符号,值被截断到的比特数在字符(或计算模UCHAR_MAX + 1,无论怎样你要考虑一下。)
如果char
已签名,则值不变,如果合适的话;实现 - 否则定义。
实际上,在您关心的计算机和编译器中,无论char
是带符号还是无符号,值总是被截断为8位。
什么是“字节”?它是'char'吗? – bitmask 2012-04-06 19:16:03
取决于什么'字节'。在C和C++中都没有这样的标准类型。那么,什么是“字节”? – AnT 2012-04-06 19:16:21
这里的一个字节是char – Nosrettap 2012-04-06 19:16:44