2012-04-06 61 views
2

如果将int作为参数传递给接收字节(char)的方法,C/C++如何处理? int是否被截断?或者是其他东西?如果您将int传递给C中的字节参数,会发生什么?

例如:

void method1() 
{ 
    int i = //some int; 
    method2(i); 
} 

void method2(byte b) 
{ 
    //Do something 
} 

怎样的INT获得 “投” 到一个字节(一个字符)?它会被截断吗?

+0

什么是“字节”?它是'char'吗? – bitmask 2012-04-06 19:16:03

+0

取决于什么'字节'。在C和C++中都没有这样的标准类型。那么,什么是“字节”? – AnT 2012-04-06 19:16:21

+0

这里的一个字节是char – Nosrettap 2012-04-06 19:16:44

回答

3

就截断,位模式(字节一般无符号的字符,但是,你必须检查)

INT I = -1;

变成

字节b = 255;当字节=无符号字符时

字节b = -1;当字节= signed char时

i = 0; b = 0;

i = 1024; b = 0;

i = 1040; b = 16;

-1

有两种情况担心:

// Your input "int i" gets truncated 
void method2(byte b) 
{ 
    ... 

// Your "method2()" stack gets overwritten 
void method2(byte * b) 
{ 
    ... 
+0

我不明白这个答案。问题中没有指针('byte *')。无论如何,为什么堆栈会被覆盖? – Celada 2012-04-06 19:21:59

7

如果byte代表char类型,行为将取决于是否char在你的平台上带符号。

如果char是无符号的,原int值减小到unsigned char范围模UCHAR_MAX+1[0, UCHAR_MAX]范围内的值将被保留。 C语言规范描述了这一过程如

...的值被重复地加上或减去小于能够在新的类型来表示,直到该值是在新的类型的范围的最大值多一个转换。

如果char类型是有符号,然后[SCHAR_MIN, SCHAR_MAX]范围内的值被保留下来,而在该范围之外的任何值在一些实现定义的方式被转换。 (C语言另外明确允许在这种情况下提高实现定义的信号)。没有普遍的答案。请咨询您的平台的文档。或者,更好的是,编写不依赖于任何特定转换行为的代码。

+0

请注意,“char”无符号的情况下的规则等于将“int”值截断为二进制补码表示的较低“log_2(UCHAR_MAX + 1)”位。 – caf 2012-04-07 12:10:46

0

您不会告诉byte是什么,但是如果您传递可转换为参数类型的参数,则该值将被转换。

如果类型具有不同的值范围,则存在该值超出参数类型范围的风险,则该值不起作用。如果它在范围内,它将是安全的。

-1

它将被转换为一个字节,就像您明确转换为(byte)i一样。

尽管上面的示例代码可能是不同的情况,除非您有未显示的method2的前向声明。由于method2在调用时尚未声明,因此编译器不知道其第一个参数的类型。在C中,函数在被调用之前应该被声明(或定义)。在这种情况下会发生什么是编译器假设(作为隐式声明)method2的第一个参数是intmethod2收到int。正式的这会导致未定义的行为,但是在大多数体系结构中,无论如何,intbyte都将在相同大小的寄存器中传递,并且它会发生作用。

0

下面是一个例子:

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) 

'希望有所帮助 - 无论你的原产地问题以及相关问题。

1

引述C++ 2003标准:

条款5.2.2 paragrah 4:当一个函数被调用时,每个参数(8.3.5)须与其相应 初始化(8.5,12.8,12.1)论据。

所以,bi初始化。那是什么意思?

8.5/14被初始化的对象的初始值是初始化器 表达式的(可能转换的)值。如有必要,将使用标准转换(第4章)将初始化程序表达式 转换为...目标类型;没有用户定义的转换被认为是

噢,i转换,使用标准转换。那是什么意思?在许多其他标准转换是这些:

4.7/2如果目标类型是无符号的,所得到的值是至少无符号整数全等到源 整数(模2 Ñ其中n是数用来表示无符号类型的位)。如果目标类型是有符号的,如果它可以在目标类型中表示(并且位宽为 ),则值不变。否则,该值是实现定义的。

哦,所以如果char是无符号,值被截断到的比特数在字符(或计算模UCHAR_MAX + 1,无论怎样你要考虑一下。)

如果char已签名,则值不变,如果合适的话;实现 - 否则定义。

实际上,在您关心的计算机和编译器中,无论char是带符号还是无符号,值总是被截断为8位。

相关问题