![]() |
1
151
我建议你照你所说的做,因为这是最直接的。初始化为
举一个可能的惊喜的例子,考虑一下这个:
它不一定将所有位1的模式存储到
并考虑这一个,它将在非二的补码表示上失败:
原因是
你应该理解的是,这一切都是关于价值的,而不是比特。变量初始化为
价值
.如果在初始值设定项中修改用于初始化的变量的位,则将根据这些位生成值。初始化所需的值
我们是
不
谈论是否
但我们所说的是初始化的结果
|
![]() |
2
46
如果您希望以C标准保证的方式设置所有位,请使用第一个位。 |
![]() |
3
24
坦率地说,我认为所有的FFF都更可读。关于它是一个反模式的注释,如果您真的关心所有的位都被设置/清除,那么我认为您可能处于一种不管怎样都关心变量大小的情况下,这种情况需要一些诸如boost::uint16_等的东西。 |
![]() |
4
17
避免上述问题的方法是:
便携的,切中要害的。 |
![]() |
5
13
我不确定在C++中首先使用标志的无符号int是个好主意。比特集之类的呢?
|
![]() |
6
10
便携? 是的 . 好吗? 有争议的 从这条线上显示的所有混淆可以证明。清楚地表明您的程序员可以理解代码而不产生混淆,这应该是我们衡量良好代码的维度之一。 而且,这种方法很容易 编译器警告 . 要在不破坏编译器的情况下删除警告,需要显式转换。例如,
显式强制转换要求您注意目标类型。如果您关注的是目标类型,那么您自然会避免其他方法的陷阱。 我的建议是注意目标类型并确保没有隐式转换。例如:
所有这些都是 正确和更明显 给你的程序员同事。
用C++ 11
我们可以使用
我认为正确和明显比简单的正确更好。 |
![]() |
7
9
将-1转换为任何无符号类型是
标准保证
导致所有的结果。使用
当然,写出来总是可以的
我个人总是用-1。它总是有效的,你不必去想它。 |
![]() |
8
5
对。如其他答案所述,
要解决这些问题,请尝试以下简单帮助器:
用途:
|
![]() |
9
5
只要你有
如果你想要一长串的比特,你可以用
无论有符号整数是如何实现的,这些值都保证将结果的所有值位设置为1。 |
![]() |
10
3
我不会做-1件事。这是相当不直观的(至少对我来说)。将有符号数据分配给无符号变量似乎违背了事物的自然顺序。
在你的情况下,我总是用
[顺便说一句,我很少看到现实世界代码中的-1技巧。]
另外,如果您真的关心一个可用的中的单个位,那么最好开始使用固定宽度
|
![]() |
11
2
在英特尔的IA-32处理器上,可以将0xffffffff写入64位寄存器并获得预期的结果。这是因为ia32e(ia32的64位扩展)只支持32位立即数。在64位指令中,32位立即数是 符号扩展 到64位。 以下是非法的:
以下将64 1s置于RAX中:
为了完整起见,下面将32 1s放在rax(aka eax)的下部:
事实上,当我想将0xffffffff写入64位变量时,程序失败了,取而代之的是0xffffffffffffffffff。在C中,这是:
结果是:
我本想把它作为评论贴在所有回答上,说0xffffffff假设32位,但是很多人都回答了,我想我会把它作为一个单独的答案添加。 |
![]() |
12
2
有关这些问题的非常清楚的解释,请参阅Litb的答案。 我的不同意见是,严格地说,这两种情况都没有保证。我不知道任何一种架构,它不代表所有位集的“1小于2的位数的幂”的无符号值,但标准实际上是这样说的(3.9.1/7加上注44):
这就使得其中一个比特可能是任何东西。 |
![]() |
13
1
实际上:是的 理论上:没有。 -1=0xffffffff(或者平台上的int的任何大小)只对two的补码算法有效。实际上,它是可行的,但是有一些遗留的机器(IBM大型机等),在那里您得到了一个实际的符号位,而不是一个二的补码表示。你提出的~0解决方案应该适用于任何地方。 |
![]() |
14
1
虽然
另一种可能性,如果
顺便说一下,形式的表达
|
![]() |
15
1
正如其他人提到的那样,-1是创建整数的正确方法,该整数将转换为无符号类型,所有位都设置为1。然而,C++中最重要的是使用正确的类型。因此,问题的正确答案(包括问题的答案)是:
这将始终包含所需的确切位数。它构造了一个
|
![]() |
16
0
它当然是安全的,因为-1将始终设置所有可用位,但我更喜欢~0。-1只是对一个
|
![]() |
17
0
我说:
这将始终为您提供所需的结果。 |
![]() |
18
0
利用这样一个事实,即为无符号类型将所有位分配给一个位等于为给定类型获取最大可能值,
Assigning -1 works for any unsigned integer type C和C++两种语言(无符号INT,UINT8YT,UIN1616T等)。 作为另一种选择,对于C++,你可以:
其目的可能是增加更多的清晰度,如分配
|
![]() |
19
-6
是的,所示的表示是非常正确的,就像我们这样做一样,反过来,u轮将需要一个运算符来反转所有的位,但是在这种情况下,如果我们考虑到机器中整数的大小,逻辑是非常简单的。 例如,在大多数机器中,一个整数是2字节=16位,它可以保存的最大值是2^16-1=65535 2^16=65536 0% 65536=0 -1%65536=65535,将其腐蚀到1111………1,所有位都设置为1(如果我们考虑剩余类mod 65536) 因此,这是非常直接的。 我猜 不,如果你考虑到这个概念,它是完美的晚餐,为未签名的整数,它实际上解决了 只需检查以下程序片段 int() {
} 对于4字节整数,b=4294967295,whcih为-1%2^32的答案 因此对于无符号整数是完全有效的 如有任何差异,请提交报告。 |
![]() |
AstralHex · 矩阵乘法代码工作不正常 4 月前 |
![]() |
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 4 月前 |
![]() |
Die4Toast · 递归调用成员箭头运算符-> 4 月前 |
![]() |
Anka Hanım · 关于结构和动态数组地址的问题 4 月前 |