Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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_Integer_Twos Complement - Fatal编程技术网

C有符号到有符号整数的转换是如何工作的?

C有符号到有符号整数的转换是如何工作的?,c,integer,twos-complement,C,Integer,Twos Complement,计算机如何在不同大小的签名整数之间转换 例如,当我将long-long int值12000000000转换为int时,它如何减少该值?它是如何处理负数的?尝试将整数表示形式转换为较小的有符号类型,而在这种类型中它无法正确表示(例如您尝试将12000000000转换为32位int)的示例)是实现定义的行为。摘自(第三段与此相关): 6.3.1.3有符号和无符号整数 1当整数类型的值转换为除_Bool以外的其他整数类型时,如果该值可以用新类型表示,则为 不变。 2否则,如果新类型是无符号的,则会通过

计算机如何在不同大小的签名整数之间转换


例如,当我将long-long int值12000000000转换为int时,它如何减少该值?它是如何处理负数的?

尝试将整数表示形式转换为较小的有符号类型,而在这种类型中它无法正确表示(例如您尝试将12000000000转换为32位
int
)的示例)是实现定义的行为。摘自(第三段与此相关):

6.3.1.3有符号和无符号整数

1当整数类型的值转换为除_Bool以外的其他整数类型时,如果该值可以用新类型表示,则为 不变。
2否则,如果新类型是无符号的,则会通过重复增加或减少新类型中可以表示的最大值的一个值来转换该值,直到该值在新类型的范围内。60)
3否则,新类型已签名,且无法在其中表示值;要么结果是实现定义的,要么引发实现定义的信号


尝试将整数表示形式转换为较小的有符号类型,但无法正确表示该类型(例如尝试将12000000000转换为32位
int
)是实现定义的行为。摘自(第三段与此相关):

6.3.1.3有符号和无符号整数

1当整数类型的值转换为除_Bool以外的其他整数类型时,如果该值可以用新类型表示,则为 不变。
2否则,如果新类型是无符号的,则会通过重复增加或减少新类型中可以表示的最大值的一个值来转换该值,直到该值在新类型的范围内。60)
3否则,新类型已签名,且无法在其中表示值;要么结果是实现定义的,要么引发实现定义的信号

它如何降低价值

发件人:

将整数类型的值转换为其他整数类型[…]时

[……]

否则,新类型已签名,且无法在其中表示值;要么结果是实现定义的,要么引发实现定义的信号

它没有定义如何转换值-相反,每个编译器可能有不同的行为,但它必须有一些文档化的行为。现在我们生活在两个互补的世界里——到处都是一样的。让我们看看GCC编译器——从EX.:

  • 当值不能在某一类型的对象(C90 6.2.1.2、C99和C11 6.3.1.3)中表示时,将整数转换为有符号整数类型所产生的结果或信号
对于转换为宽度为N的类型,该值以2^N的模减小,以在该类型的范围内;没有发出任何信号

因此,我们:

长整型值12000000000到整型

让我们假设
long long int
有64位,
int
有32位,byte有8位,我们使用两位补码,所以
int_MIN=-2147483648
int_MAX=2147483647和
N
是32,而
2^N
是4294967296。你应该看一下,我们知道:

12000000000 = 3 * 4294967296 + -884901888

因此,它将转换为-884901888。这与用来存储数字的格式无关——它可以是它想要的任何格式

现在,
gcc
是智能的,虽然文档中用模运算说明了算法的数学描述,但您可以注意到:

$ printf("%16llx\n%16x\n", 12000000000ll, (int)12000000000ll);
       2cb417800
        cb417800
即“模2^32”的数学运算在二进制中等于对所有位进行AND掩码设置
num&0xffffffff

它是如何处理负数的

完全一样,只有一个负号。例如
-12000000000ll

-12000000000ll = -3 * 4294967296 + 884901888 
因此,
(int)-12000000000ll
将转换为
884901888
。请注意,在二进制中,它只是:

$ printf("%16llx\n%16x\n", -12000000000ll, (int)-12000000000ll);'
fffffffd34be8800
        34be8800
它如何降低价值

发件人:

将整数类型的值转换为其他整数类型[…]时

[……]

否则,新类型已签名,且无法在其中表示值;要么结果是实现定义的,要么引发实现定义的信号

它没有定义如何转换值-相反,每个编译器可能有不同的行为,但它必须有一些文档化的行为。现在我们生活在两个互补的世界里——到处都是一样的。让我们看看GCC编译器——从EX.:

  • 当值不能在某一类型的对象(C90 6.2.1.2、C99和C11 6.3.1.3)中表示时,将整数转换为有符号整数类型所产生的结果或信号
对于转换为宽度为N的类型,该值以2^N的模减小,以在该类型的范围内;没有发出任何信号

因此,我们:

长整型值12000000000到整型

让我们假设
long long int
有64位,
int
有32位,byte有8位,我们使用两位补码,所以
int_MIN=-2147483648
int_MAX=2147483647和
N
是32,而
2^N
是4294967296。你应该看一下,我们知道:

12000000000 = 3 * 4294967296 + -884901888

因此,它将转换为-884901888。这与用来存储数字的格式无关——它可以是它想要的任何格式

现在,
gcc
是智能的,虽然文档中用模运算说明了算法的数学描述,但您可以注意到:

$ printf("%16llx\n%16x\n", 12000000000ll, (int)12000000000ll);
       2cb417800
        cb417800
即“模2^32”的数学运算在二进制中等于对所有位进行AND掩码设置
num&0xffffffff

它是如何处理负数的

完全一样,只有一个负号。考试