环是一种标准的数学结构,用于描述可以相加和相乘的对象。C#和Java签名的long
是否遵守环的所有属性?例如,乘以Long.MIN_VALUE总是关联的和分配的吗?假设我们处于未检查的上下文中。
(从维基百科复制的定义)
环是一个集合R,它配备了满足以下三组公理的二进制运算+和·,称为环公理。
- R是加法下的阿贝尔群,意味着
- (a+b)+c=a+(b+c)对于R中的所有a,b,c(+是关联的)
- a+b=b+a对于R中的所有a,b(+是可交换的)
- 在R中有一个元素0,使得对于R中的所有a,a+0=a(0是加性恒等式)
- 对于R中的每个a,R中都存在−a,使得a+(−a)=0(−a是a的加性逆)
- R是乘法下的一个幺半群,意味着:
- (a‧b)‧c=a‧(b‧c)对于R中的所有a,b,c(‧是关联的)
- 在R中有一个元素1,使得对于R中的所有a(1是乘法恒等式),a·1=a和1·a=a
- 乘法相对于加法是可分配的:
- a·(b+c)=(a·b)+(a·c)对于R中的所有a,b,c(左分布性)
- 对于R(右分布性)中的所有a,b,c,(b+c)·a=(b·a)+(c·a)
交换环是乘法是可交换的(意思是A·b=b·A)。
在溢出被定义为包装的有符号值的平台上,有符号和无符号值在馈送到+
、-
、*
、&
、^
、|
、<<
和~
运算符时,或在对较小类型执行未检查的强制转换时,将以同构的方式表现。当与关系运算符>>
、%
和/
运算符一起使用时,以及当强制转换或提升为较大类型时,它们的行为会有所不同。
因为任何给定大小的无符号值都将表现为环,所以有符号值也会这样做。注意,由于对int
的隐式提升,较小的类型可能不一定表现为算术环,因为将+
和*
应用于这种类型的一些值可能会产生不是该类型的值的东西。
至少根据Java的溢出规则,有符号长的加法、减法和乘法与将64位视为64位无符号值时得到的结果完全相等,这与将它们视为mod 2^64的整数相同,这应该足以证明这一说法。