我想要一个具有以下签名的函数:
bool signed_a_greater_than_signed_b(unsigned char a, unsigned char b);
Run Code Online (Sandbox Code Playgroud)
它的输出应该是1iff存储的位a的2的补码视图大于存储的位的2的补码视图b.否则输出应该是0.例如:
signed_a_greater_than_signed_b(0b10000000,any number) => 0
signed_a_greater_than_signed_b(0b01111111,any number other than 0b01111111) => 1
signed_a_greater_than_signed_b(0b00000000,0b00000001) => 0
signed_a_greater_than_signed_b(0b00000000,0b11111111) => 1
signed_a_greater_than_signed_b(0b00000000,0b00000000) => 0
Run Code Online (Sandbox Code Playgroud)
该函数不具有任何隐式/显式转换(因为这些转换是实现定义的,因此不可移植)
一个这样的实现是:
bool signed_a_greater_than_signed_b(unsigned char a, unsigned char b)
{
// if 'signed' a is positive then
// return 1 if a is greater than b or b is negative
// otherwise, if 'signed' a is negative then
// return 1 …Run Code Online (Sandbox Code Playgroud) 在解决K&R C书中的练习时,我偶然发现了练习2.1.
起初,我为UINT_MAX作为-1,但后来我用的%u占位符,但现在它让我有相同的号码ULONG_MAX.
在这本书的附录B,他们说,UINT_MAX应该是65535和ULONG_MAX应4294967295,但在运行时的运动,它的给我两个UINT_MAX和ULONG_MAX作为4294967295.
这是为什么?
我想将两个相乘,unsigned integers但我希望结果存在于一个unsigned long long变量中
unsigned long long M;
unsigned int X;
unsigned int Y;
X = 999999;
Y = 9990;
M = X * Y;
Run Code Online (Sandbox Code Playgroud)
M应该9989990010但由于某种原因它一直存在1400055418
我已经困扰了一个星期了,我想我已经到了想哭的地步!
void GetKey(int date, unsigned char[] key)
{
}
Run Code Online (Sandbox Code Playgroud)
我试图传递unsigned char数组ta函数,但我得到一个错误"expected a')'"where"key"变量是.
for (i = 0; i <= N; ++i) { ... }
Run Code Online (Sandbox Code Playgroud)
如果N为,则该特定语句将导致无限循环INT_MAX.已经知道无符号溢出正在包装溢出,假设i和N无符号,编译器可以假设N+1如果i在溢出时未定义,则循环将完全迭代.这里需要注意的是:如果我将循环设为,
for (i = 0; i < N; ++i) { ... }
Run Code Online (Sandbox Code Playgroud)
这仍然是未定义的行为吗?
为什么在签名整数的情况下INT_MAX + 1肯定不相同INT_MIN?
如何将字符串转换为unsigned long long int?
问题是,如果我使用strtol它返回一个long int,但我需要转换一个比这更长的字符串.
假设一个有8个无符号字符x1,x2,...x8,我们想要计算:
abs((x1 + x2 + x3 + x4) - (x5 + x6 + x7 + x8)) / 4
Run Code Online (Sandbox Code Playgroud)
在不引入大量上溢或下溢错误的情况下,确保最准确结果的最佳方法是什么?
我在模板类中使用它,这就是为什么我不能将无符号值转换为有符号值.
这对我来说有点混乱,但我必须看看我在x中出现了多少次.因此,如果有人为i输入3而x为4294967295,则应该说0次,但如果有人输入9表示i和4294967295表示x,则应该说3次.
这就是我所拥有的,但输出0表示为0,所以它不起作用..
int main(int argc, char** argv) {
unsigned int i;
scanf("%u", &i);
unsigned int x;
scanf("%u", &x);
int output = 0;
int t = 0;
while (t < 10) {
x /= 10;
if (i == x) {
output++;
}
t++;
}
printf("%d", output);
}
Run Code Online (Sandbox Code Playgroud) int默认情况下,C,C++,C#,Java,Rust等已签名.大多数时候你需要无符号变量,因为你必须表示低于零的东西的情况比处理自然数的情况要少.无符号变量也不必以2的补码形式编码,并且对于额外的值范围,它们具有最高有效位.
考虑到所有这些因素,为什么语言创建者会默认签名?
我该如何转换这个数组:
int[] ints = { 233, 154, 24, 196, 40, 203, 56, 213, 242, 96, 133, 54, 120, 146, 46, 3 };
Run Code Online (Sandbox Code Playgroud)
到这个字符串?
String base64Encoded = "6ZoYxCjLONXyYIU2eJIuAw==";
Run Code Online (Sandbox Code Playgroud)
用法:
String base64Encoded = ConvertToBase64(int[] ints);
Run Code Online (Sandbox Code Playgroud)
(我问这个问题,因为byte在Java中签名,但byte在C#中是无符号的)