目录html
目录linux
&
, |
, |
, ^
;&&
, ||
, !
;在转换时, 位模式中每一位的数值是同样的、不改变的;改变的是最高位(有符号数符号位、无符号数最高有效位)的权值。git
表达式 | 类型 | 求值 |
---|---|---|
-2147483647-1 == 2147483648U | ( _____________________ ) | ( _____________________ ) |
-2147483647-1 < 2147483647 | ( _____________________ ) | ( _____________________ ) |
-2147483647-1U < 2147483647 | ( _____________________ ) | ( _____________________ ) |
-2147483647-1 < -2147483647 | ( _____________________ ) | ( _____________________ ) |
-2147483647-1U < -2147483647 | ( _____________________ ) | ( _____________________ ) |
问题缘由分析:
-2147483647-1
值得是C语言中 TMin 的写法,不可简单写成 0x80000000
。
仍是没有搞懂:数值绝对值相同的状况下,正数与负数之间的转换。
除0之外,符号位取反,数值位按位取反,再+1;便可将正数(或负数)转换为负数(或正数)。
例如:
第5个小题:-2147483647-1U
为 0x80000000
(2^31), +2147483647
为 0x7FFFFFFF
((2^31)-1) ,-2147483647
为 0x7FFFFFFF
符号位取反(==0xFFFFFFFF
),数值位按位取反(==0x80000000
),再+1(==0x80000001
)。因为是无符号数与有符号数之间的比较,有符号数按无符号数看,因此-2147483647-1U < -2147483647
为 0x01
。正则表达式
问题解决方案:安全
表达式 | 类型 | 求值 |
---|---|---|
-2147483647-1 == 2147483648U | 无符号数 | 0x01 |
-2147483647-1 < 2147483647 | 有符号数 | 0x01 |
-2147483647-1U < 2147483647 | 无符号数 | 0x00 |
-2147483647-1 < -2147483647 | 有符号数 | 0x01 |
-2147483647-1U < -2147483647 | 无符号数 | 0x01 |
疑惑:
1 - 1
的存在溢出么?
[0001] - [0001] = [0000]
对么?学习
疑惑解答:
1 - 1
的存在溢出。
[0001] - [0001] = [0000]
错误。
对于无符号数而言,减法直接借位减。但对于有符号数来讲,被减数为负数时,是加上该负数的补码。
这么来讲的话, 1 - 1
的二进制过程为:
[0001] + [1111] = [10000]
截断4位以后为 [0000]
,此时是溢出。编码
运行以下实例:.net
# include <stdio.h> int tadd_ok(int x, int y); int main() { printf("%d\n",tadd_ok(0X00000001, 0x8FFFFFFF)); printf("%d\n",tadd_ok(1, -1)); } int tadd_ok(int x, int y) { int sum = x+y; int neg_over = x < 0 && y < 0 && sum >= 0; int pos_over = x >= 0 && y >= 0 && sum < 0; return !neg_over && !pos_over; }
结果:设计
Linux> ./a.out 1 1
对应仓库网页连接:https://gitee.com/Yogile/Cpt_System_Yogilecode
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 4000行 | 20篇 | 280小时 | |
第一周 | 66/66 | 1/1 | 24/24 | |
第二周 | 427/493 | 2/3 | 25/49 |
计划学习时间:16小时
实际学习时间:25小时