假设我有这个号码i = -6884376.我如何将其称为无符号变量?像(unsigned long)iC中的东西
我已经在C和C++的上下文中看到了这些,但有符号和无符号变量之间有什么区别?
在Java中,没有无符号字节.
使用某些低级代码时,有时需要处理大于128的无符号值的字节,这会导致Java将其解释为负数,因为MSB用于符号.
解决这个问题的好方法是什么?(说不要使用Java不是一个选项)
我有一个用于在C中实现的编程语言的VM.它支持在32位和64位架构以及C和C++下编译.
我正在尝试使用尽可能多的警告来干净地编译它.当我打开时CLANG_WARN_IMPLICIT_SIGN_CONVERSION,我会得到一连串的新警告.
我希望有一个很好的策略,可以使用何时使用int显式无符号类型和/或显式大小的类型.到目前为止,我无法确定该策略应该是什么.
将它们混合使用 - 主要int用于局部变量和参数之类的东西,并在结构中使用较窄的类型- 确实会导致许多隐式转换问题.
我喜欢为struct字段使用更具体的大小类型,因为我喜欢显式控制堆中对象的内存使用量的想法.此外,对于散列表,我在散列时依赖于无符号溢出,因此如果散列表的大小存储为,则很好uint32_t.
但是,如果我尝试在任何地方使用更具体的类型,我发现自己到处都是曲折的迷宫.
其他C项目有什么作用?
我想知道是否
std::is_unsigned<bool>::value
Run Code Online (Sandbox Code Playgroud)
根据标准是否明确定义?
我问这个问题因为typename std::make_unsigned<bool>::type没有明确定义.
对于Java中的某些散列函数,将值视为无符号整数(例如,与其他实现进行比较)会很好,但Java仅支持有符号类型.我们可以将签名转换为int"未签名" long,如下所示:
public static final int BITS_PER_BYTE = 8;
public static long getUnsignedInt(int x) {
ByteBuffer buf = ByteBuffer.allocate(Long.SIZE / BITS_PER_BYTE);
buf.putInt(Integer.SIZE / BITS_PER_BYTE, x);
return buf.getLong(0);
}
getUnsignedInt(-1); // => 4294967295
Run Code Online (Sandbox Code Playgroud)
但是,这个解决方案对我们真正做的事情来说似乎有些过分.有没有更有效的方法来实现同样的事情?
这是一个相当愚蠢的问题,但为什么int常用而不是unsigned int在C或C++中为数组定义for循环时?
for(int i;i<arraySize;i++){}
for(unsigned int i;i<arraySize;i++){}
Run Code Online (Sandbox Code Playgroud)
我认识到int在进行数组索引以外的操作时使用的好处以及使用C++容器时迭代器的好处.是不是因为在循环数组时无关紧要?或者我应该一起避免它并使用不同的类型,如size_t?
int main(void)
{
unsigned int y = 10;
int x = – 4;
if (x > y)
Printf("x is greater");
else
Printf("y is greater");
getch();
return (0);
}
Output: x is greater
Run Code Online (Sandbox Code Playgroud)
我认为输出y会更大,因为它是无符号的.这背后的原因是什么?