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)中表示时,将整数转换为有符号整数类型所产生的结果或信号
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)中表示时,将整数转换为有符号整数类型所产生的结果或信号
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
它是如何处理负数的
完全一样,只有一个负号。考试