如果将int传递给C中的byte参数会发生什么?

时间:2012-04-06 19:14:03

标签: c++ c int byte

如果将int作为参数传递给接受字节(char)的方法,C / C ++如何处理? int被截断了吗?或其他什么?

例如:

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

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

int如何“转换”为一个字节(一个字符)?是否会被截断?

7 个答案:

答案 0 :(得分:7)

如果byte代表char类型,则行为将取决于您平台上char是已签名还是未签名。

如果char未签名,则原始int值会减少到unsigned char范围模UCHAR_MAX+1。保留[0, UCHAR_MAX]范围内的值。 C语言规范将此过程描述为

  

...通过重复加或减一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内。

如果char类型已签名,则保留[SCHAR_MIN, SCHAR_MAX]范围内的值,而此范围之外的任何值都以某种实现定义的方式转换。 (C语言另外明确允许在这种情况下引发实现定义的信号。)I。没有普遍的答案。请参阅平台的文档。或者,更好的是,编写不依赖于任何特定转换行为的代码。

答案 1 :(得分:3)

只是截断了AS位模式(字节通常是unsigned char,但是,你必须检查)

int i = -1;

变为

字节b = 255;当byte = unsigned char

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

i = 0; b = 0;

i = 1024; b = 0;

i = 1040; b = 16;

答案 2 :(得分:1)

引用C ++ 2003标准:

  

条款5.2.2第4段:调用函数时,每个参数(8.3.5)应初始化(8.5,12.8,12.1)及其对应的   参数。

因此,b 已使用i初始化。这是什么意思?

  

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

哦,i 转换,使用标准转换。那是什么意思?许多其他标准转换包括:

  

4.7 / 2如果目标类型是无符号的,则结果值是与源一致的最小无符号整数   整数(modulo 2 n 其中n是用于表示无符号类型的位数)。

     

4.7 / 3如果目标类型已签名,则该值如果可以在目标类型中表示,则该值不变(和   位域宽度);否则,该值是实现定义的。

哦,所以如果char是无符号的,那么该值会被截断为char中的位数(或者计算模数UCHAR_MAX + 1,无论你想怎么想它。)

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

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

答案 3 :(得分:0)

你不知道byte是什么,但是如果你传递一个可转换为参数类型的参数,那么这个值就会被转换。

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

答案 4 :(得分: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)

'希望这对您的原始问题和相关问题都有帮助。

答案 5 :(得分:-1)

有两种情况需要担心:

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

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

答案 6 :(得分:-1)

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

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