- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
int x = random();
int y = random();
unsigned ux = (unsigned) x;
unsigned uy = (unsigned) y;
对于以下每个 C 表达式,您要指出是否或not the expression always yields 1. 如果它总是产生 1,请描述基本的数学原理。否则,给出一个使它产生 0 的参数的例子。
A. (x<y) == (-x>-y)
B. ((x+y)<<4) + y-x == 17*y+15*x
C. ~x+~y+1 == ~(x+y)
D. (ux-uy) == -(unsigned)(y-x)
E. ((x >> 2) << 2) <= x
对于这些问题,我得到只有 A 可以产生 0,而其余的总是产生 1。
我知道这可能是错误的,我不是在寻找直接的答案,但我希望获得一些关于如何解决这些问题的一般知识/建议。
我有一个非常糟糕的教授,我一直在尝试在线查找资源,但我真的不知道从哪里开始或寻找什么。我知道无符号/二进制补码算术和位移的基础知识,但我不知道如何应用它来找到这些问题的反例。
最佳答案
C 编程语言没有指定整数有符号量溢出的结果;它既没有定义 x << n
如果x
有符号且为负。
但是,考虑到带符号和无符号的 n 位整数都是以二进制补码系统表示的以 2^n 为模的数字,执行算术运算而不考虑符号的情况并不少见。
您的练习必须假定这一点,否则几乎没有意义。
8 位整数示例:
unsigned domain: (0..127), ( 128..255)
signed domain: (0..127), (-128..-1)
以二进制表示:
unsigned domain: 00000000..01111111 and 10000000..11111111
signed domain: 00000000..01111111 and 10000000..11111111
有符号和无符号之间,只有整数的代表系统模 2^n 不同,与打印相关,但与内部无关计算(只要只使用 +
、 -
、 *
和按位运算)。
对于有符号整数,恰好负整数的第一位设置为1. signed 和 unsigned 之间的转换是无关紧要的,除了打印。
我坚持,这是你练习的假设,但是 C 编程语言没有具体说明我的大部分主张。
一个。 (x<y) == (-x>-y)
被 x == INT_MIN
反驳, y == INT_MIN + 1
,因为INT_MIN == -INT_MIN
.
B. ((x+y)<<4) + y-x == 17*y+15*x
正确:
((x+y) << 4 ) + y-x
== ((x+y) * 0x10000) + y-x
== ((x+y) * 16 ) + y-x
== 17 * y + 15 * x
C. ~x+~y+1 == ~(x+y)
正确:
x + ~x + 1 == 0
~x + 1 == -x
~(x+y) + 1 == -(x+y)
~(x+y) + 1 == -x + -y
~(x+y) + 1 == ~x + 1 + ~y + 1
~(x+y) == ~x + ~y + 1
D. ((unsigned)x-(unsigned)y) == -(unsigned)(y-x)
True:假设从 signed 到 unsigned 的转换不会改变内部表示,并且运算符被假定为忽略的符号整数。换句话说,x-y == -(y-x)
在任何地方都适用。
E. ((x >> 2) << 2) <= x
正确:
x
== (x >> 2) << 2 + two_last_significant_bits_of_x
== (x >> 2) << 2 + positive
>= (x >> 2) << 2
带符号的 32 位整数示例:
x == 5
x == 00000000000000000000000000000101 in base2
x >> 2 == 00000000000000000000000000000001 in base2
(x >> 2) << 2 == 00000000000000000000000000000100 in base2
(x >> 2) << 2 == 4
x == -5
x == 11111111111111111111111111111011 in base2
x >> 2 == 11111111111111111111111111111110 in base2
(x >> 2) << 2 == 11111111111111111111111111111000 in base2
(x >> 2) << 2 == -8
关于c - Unsigned/Signed Arthmetic Problems from A Programmer's Perspective 教科书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43033421/
我不知道下面的代码有什么问题,它应该读取数字并将它们的值与位置放在一个成对的 vector 中,然后对它们进行排序并打印出位置。我用 sort 删除了部分 - 我认为问题就在那里,但我再次收到编译错误
我相信当您将两个 unsigned int 值相加时,返回值的数据类型将是 unsigned int。 但是两个 unsigned int 值相加可能会返回一个大于 unsigned int 的值。
我从左移得到的结果我找不到解释。 unsigned char value = 0xff; // 1111 1111 unsigned char = 0x01; // 0000 0001 std::c
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 8 年前。 Improve th
根据:http://en.wikipedia.org/wiki/C_data_types您可以使用 unsigned short 类型或 unsigned short int 类型。但是它们之间有什么
我正在尝试在 arduino 草图中实现 CRC16。从网上拿到了crc.c文件,想试试看。我创建了其他文件以允许 crc.c 正确运行。这是我的文件。 crc.h: #ifndef CRC_C_ #
我正在尝试实现一个将存储相关索引的列表。但是,我在标题中提到的 for (index_itr = (list_size - numberOfEvents - 1) 处遇到错误。我在做什么错误,以及如何
这不是跨平台代码...所有内容都在同一平台上执行(即字节序是相同的......小字节序)。 我有这个代码: unsigned char array[4] = {'t', 'e', 's', '
我有一个 8 位 unsigned char vector 和一个 16 位 unsigned short vector std::vector eight_bit_array; std::vecto
这个问题在这里已经有了答案: Is subtracting larger unsigned value from smaller in C++ undefined behaviour? (2 个答案
这个问题已经有答案了: Difference between unsigned and unsigned int in C (5 个回答) 已关闭 6 年前。 在 C 语言中,unsigned 之间有
我遇到了一个我不太理解的警告。该警告是通过比较我认为是一个未签名的内容与另一个未签名的内容而生成的。 来源如下: #include #include #include #include int
好吧,这一定很愚蠢。我在移动一些代码时遇到了这个问题,并认为我打错了字或未能正确使用调试器。作为健全性检查,我创建了这个测试用例,但它似乎仍然失败。 unsigned int vtxIdx
我有一个同事不热衷于使用现代 C++ 例如,当我要求他开始使用 r_value 引用时,他不会这样做。当我要求他使用 std::array 而不是 c 数组(char example[8])时,他不会
我有一个无符号字符数组,例如Data[2]。我需要它来与返回 unsigned int 的函数的输出进行比较。 我尝试将 Data[2] 转换为 unsigned int,反之亦然。它没有用。 我想做
我遇到了一个我不太明白的警告。警告是通过将我认为是未签名的与另一个未签名的进行比较而生成的。 这是来源: #include #include #include #include int mai
在下面的程序中,我使用了 unsigned 关键字。 #include int main() { unsigned char i = 'A'; unsigned j
整数值转换为浮点值并再次返回时是否与原始整数值相同? 例如: unsigned x = 42; double y = x; unsigned z = y; 假设编译器没有优化浮点转换,x == z 是
这个问题在这里已经有了答案: Difference between unsigned and unsigned int in C (5 个答案) 关闭 9 年前。 我理解 unsigned 和 un
您好,我遇到了一个关于位运算的小概念问题。请参阅下面的代码,其中我有一个 4 字节的无符号整数。然后我通过将地址分配给无符号字符来访问各个字节。 然后我将最后一个字节的值设置为 1。并对 unsign
我是一名优秀的程序员,十分优秀!