怎么判断永真和非永真

无符号数变量ux和uy的声明和初始化如下

img

若sizeof(int)=4,则对于任意int型变量x和y,判断以下关系式是否永真。若永真请给出说明;若不永真则给出结果为假的一组x和y的取值,并编写小程序验证。注意:用c90标准进行编译,编辑命令如下。
gcc -std=c90 -o x.c

img

(1)不永真,平方和可能超出int型取值范围,溢出后最高位是1时,就是负数了
(2)不永真,比如负数,-113二进制是10001111,经过右移两位,左移两位后变成10001100,,1进制是-116,显然-113>-116
(3)不永真,只要x<<2或y<<3有溢出,肯定不相等。----此条改为永真
(4)永真,左移没有溢出问题。x/4和y/8是整除
(5)永真,因为dx的值来自与int型的x,两个int类型相乘结果不会超出double类型范围
(6)不永真,浮点数都是有精度误差的
(7)不永真,浮点数都是有精度误差的
(8)不永真,dx或dy为0时有问题

1.不永真,有符号型乘法,结果也是有符号型,所以x*x有可能是个负数,反例:x=65535
2.永真,右移2位后,再左移两位,其实就等于将后两位置成0了。那么不管x是正数还是负数,后两位变0都是比原来更小。如果后两位本来就是0,那就相等。
3.永真,左移运算和乘法运算是等价的,如果乘法溢出,移位也必定溢出,溢出后的值也相等
4.永真,右移运算和除法运算是等价的,同上
5.永真,double型字节比int多,用int赋值double是不会溢出的,所以平方之后总为非负
6.不永真,反例x=123456789,因为转float时会损失精度
7.不永真,反例x=y=2147483647,因为x是有符号型,相加有可能溢出变成负数,再转double还是负数,而先转double再加不会溢出
8.不永真,dx或dy==0时会抛错误,表达式无意义

(1)不依赖于命题变元的真值指派,而总是取值为 T(即 1)的命题公式,称为永真式或称作重言式。

(2)不依赖于命题变元的真值指派,而总是取值为F(即0)的命题公式,称为永假式或矛盾式

【请问用C90标准该如何编译】
这取决于编译器,检查编译器定义的宏:gcc -dM -E - < /dev/null
结合查看关于标志的手册。就可判断了

第一个好像就是为永真,虽然x*x会出现了溢出,但是不知道为什么进行x*x>=0条件判断就是为真
其余的没有看了,在纠结第一个

img

1、永真式指重言式。重言式(Tautology )又称为永真式,它的汉语拼音为:[Chóng yán shì],是逻辑学的名词。命题公式中有一类重言式。如果一个公式,对于它的任一解释下其真值都为真,就称为重言式(永真式)。数理逻辑旨在利用有限的公理推出尽可能多的重言式,除此之外,重言式在计算机词法分析领域也具有重要应用。

2、永假式指矛盾式。矛盾式又称永假式、不可满足公式,是逻辑演算的一类公式。如果对任意一个赋值V,都有V[A]=0,即公式A对任一赋值均取“假”值,则公式A为矛盾式。在逻辑演算中,公式按取值情况分为三种:对任一赋值都取“真”值的为恒真式,恒真式在命题演算中为重言式,在谓词演算中即为普遍有效式;对某些赋值取“真”值、对某些赋值取“假”值的为可满足但非恒真式;还有一类即为矛盾式。其中普遍有效式表达一定的逻辑规律,而矛盾式则表达一的逻辑矛。