我得到一个十六进制字符串,需要转换为带符号的8位整数.目前我正在使用Int16/Int32进行转换,这显然不会给出8位整数的负值.如果我在十六进制中得到值255,我如何将其转换为十进制的-1?我假设我想使用sbyte,但我不确定如何正确地获得该值.
public class Main3 {
public static void main(String[] args) {
Integer min = Integer.MIN_VALUE;
String minHex = Integer.toHexString(Integer.MIN_VALUE);
System.out.println(min + " " + minHex);
System.out.println(Integer.parseInt(minHex, 16));
}
}
Run Code Online (Sandbox Code Playgroud)
给
-2147483648 80000000
Exception in thread "main" java.lang.NumberFormatException: For input string: "80000000"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
at java.lang.Integer.parseInt(Integer.java:459)
at Main3.main(Main3.java:7)
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
我正在观看David Malan(这里)的一些很棒的讲座,这些讲座已经过了二元版.他谈到签名/未签名,1的赞美和2的补充表示.还增加了4 +( - 3),排列如下:
0100
1101 (flip 0011 to 1100, then add "1" to the end)
----
0001
Run Code Online (Sandbox Code Playgroud)
但他挥挥手,挥动了最后一根手.我做了一些维基百科的研究并没有得到它,有人可以向我解释为什么特定的携带(在8的 - > 16的列中)被丢弃了,但他保留了它之前的那个?
谢谢!
此相关问题是关于在编译时确定签名类型的最大值:
但是,我已经意识到在运行时确定有符号类型(例如time_t或off_t)的最大值似乎是一项非常困难的任务.
我能想到的最接近解决方案的是:
uintmax_t x = (uintmax_t)1<<CHAR_BIT*sizeof(type)-2;
while ((type)x<=0) x>>=1;
Run Code Online (Sandbox Code Playgroud)
只要type没有填充位,这就避免了任何循环,但是如果type确实有填充位,则强制转换会调用实现定义的行为,这可能是信号或无意义的实现定义转换(例如,剥离符号位).
在我看来,我开始认为问题是无法解决的,这有点令人不安,并且会成为C标准的缺陷.证明我错的任何想法?
我想将int32_t主机字节顺序转换为网络字节顺序,反之亦然.我知道htonl()函数及其变体,但这需要无符号整数.是否有标准库函数可以使用有符号整数执行相同的操作,还是我必须自己实现它?如果我必须自己实施,我应该怎么做?
我正在寻找一个适用于Linux和Mac OS X的例程.
我正在使用Visual Studio 2013.
最近我尝试了~运算符1的补码:
int a = 10;
cout << ~a << endl;
Run Code Online (Sandbox Code Playgroud)
输出是 -11
但对于
unsigned int a = 10;
cout << ~a << endl;
Run Code Online (Sandbox Code Playgroud)
输出是 4294967296
我不明白为什么输出是-11签名的情况int.请帮我解决这个困惑.
在PostgreSQL中,我想存储已签名的值-999.9- 9999.9.我可以用numeric(5.1)它吗?
或者我应该使用什么类型?
我有一个来自无符号48位纳秒计数器的两个值,它可能会换行.
我需要两倍的差异,以纳秒为单位.
我想我可以假设读数是在大致相同的时间进行的,所以对于两个可能的答案,我认为我是最安全的.
他们都存储为uint64_t.因为我认为我不能拥有48位类型.
我想计算它们之间的差异,作为有符号整数(大概int64_t),考虑包装.
所以,例如,如果我开始
x=5
y=3
Run Code Online (Sandbox Code Playgroud)
然后结果x-y是2,并且如果我增加两个,x并且y即使它们包裹在最大值的顶部时也会保持这样0xffffffffffff
类似地,如果x = 3,y = 5,那么xy是-2,并且每当x和y同时递增时将保持不变.
如果我可以宣布x,y作为uint48_t和差异int48_t,我想
int48_t diff = x - y;
Run Code Online (Sandbox Code Playgroud)
会工作的.
如何使用我可用的64位算法模拟此行为?
(我认为任何可能运行的计算机都会使用2的补码算法)
PS我可能会破解这个,但我想知道是否有一个很好的标准方法来做这种事情,下一个阅读我的代码的人将能够理解.
PPS此外,这段代码最终会出现在最严格的紧密循环中,所以有效编译的东西会很好,所以如果必须有选择,速度就会超过可读性.
有没有办法写一个类型特征来确定一个类型是否支持C++中的负零(包括整数表示,如符号和大小)?我没有看到任何直接这样做的东西,并且std::signbit似乎不是constexpr.
澄清:我问,因为我想知道这是否可能,无论用例是什么,如果有的话.