为什么我得到这个输出?
字节x; x = 127; x << = 3; //与x = x相同<< 3 println(x)
输出:-8
当我在纸上记下它并且弄乱了我得到的那些 - 11111000,那是= 248?
我想Byte占用1个字节(8位).不知道它是签名还是未签名?我认为它要签名?
因为C中给出的下面代码也给了我-8:
signed char x = 127; X << = 3; printf("x =%d \n",x的值);
为什么-8 ?? rgd softy
我正在使用Java开发Android 2.3.3应用程序.
这个应用程序是一个iOS代码,无符号数据类型移植到Java.
在iOS上,它适用于UInt16和UInt8.在一个案例中使用byte[]我正在使用char[].
但是知道我必须发送char[]一个byte[]使用DatagramPacket类.
如果char []的一个元素是128,我怎么能插入到byte []并且接收器得到128.我不知道如果我这样做会发生什么:
char c = (char)128;
byte b = (byte)c;
Run Code Online (Sandbox Code Playgroud)
哪个b有价值?
128 = 10000000. b = -1或b = 127?
如何char[]在byte[]不丢失任何位的情况下转换为?
我试图在嵌入式C/C++环境中进行一些简单的变量操作.由于某种原因,我一直在得到零.
这是代码
void Heater::setPower( int newpower )
{
printf("1 new power %d\n",newpower);
if(newpower != power)
power = newpower;
else
return;
printf("2 new power %d\n",power);
// Set Duty
long unsigned int newduty = 0;
// Protect from divide by zero
if(power <= 0)
{
printf("2.5 zeroed\n");
newduty = 0;
power = 0;
}
else
newduty = period*(power/100);
printf("3 setduty %lu period %lu\n", newduty, period);
setDuty(newduty);
}
Run Code Online (Sandbox Code Playgroud)
这是我收到的输出
1 new power 76
2 new power 76
3 setduty 0 period 10000000
Run Code Online (Sandbox Code Playgroud)
所以我知道收到的号码是76.我知道它已经超过了第一个障碍,第二个障碍.但不知何故,在简单的数学方程式中,它变为零."period"也是一个长的unsigned …
我最近尝试了一些C编程,偶然发现了以下问题.我正在使用带有MinGW 32位的NetBeans 7.4 64 IDE.这是一个简短的示例代码,它突出了我的问题:
int main(void) {
unsigned short int temp;
char *pointer;
pointer = malloc(12 * sizeof(char));
printf("The pointers value is %d \n", (int)pointer);
printf("Type a short string:\n");
gets(pointer);
printf("The pointers value is %d \n", (int)pointer);
printf("Type an int: \n");
//This line changes the char pointer to an apparently random value
scanf("%d", &temp);
//Segmentation fault upon this point
printf("The pointers value is %d \n", (int)pointer);
//And here as well
free(pointer);
return (EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)
直到scanf一切都很好.读取的字符串被写入指向的内存空间指针.但是,在处理了scanf后,指针的值会发生变化,因此指针指向任何空间.所以不仅我的字符串丢失了,而且在尝试访问/释放不属于我的程序的内存时也会出现分段错误.
价值变化显然是随机的.每次我调试这个程序时,指针都会变为另一个值.
我已经推断出unsigned short int是错误的,或者说是我的scanf中错误的格式说明符(%d而不是%hu).如果我将unsigned …
我在一段我想要了解的代码中找到了这个.这可能是一些聪明的伎俩,但我不明白.什么时候
unsigned(x-dx)<unsigned(size)
Run Code Online (Sandbox Code Playgroud)
真正?x,dx和size都是(signed)int.从我猜测的上下文来看,x-dx不应小于零且不大于大小.但我不明白未签名的伎俩.
有人可以解释它或告诉我在哪里可以找到更多关于它的信息吗?
thx提前
我已经提炼了一个问题,这让我弄清楚发生了什么,但仍然不是原因.
int main() {
unsigned int a = 2;
char c[2] = {};
char* p = &c[1];
return p[1 - a];
}
Run Code Online (Sandbox Code Playgroud)
重写最后一行时更清楚一点.
return *(p + (1 - a)); /* equivalent */
return *(p + 1 - a); /* works */
return *(p + (1 - (int)a)); /* works */
Run Code Online (Sandbox Code Playgroud)
我很惊讶编译器没有在内部删除括号.而且更多的是它显然试图保持类型的暂时负面结果unsigned int.除非这不是分段错误的原因.在汇编程序输出中,带括号和不带括号的代码之间的差别很小.
- movl $1, %eax
- subl -12(%rbp), %eax
- movl %eax, %edx
+ movl -12(%rbp), %eax
+ movl $1, %edx
+ subq %rax, %rdx
Run Code Online (Sandbox Code Playgroud) 我正在使用VS 2012,而我正在读这本教授C\C++基础的书.这本书很老了,它不是在VS中教,而是在Borland C++中教.本课程教授如何将无符号值转换为int.在书中,它表示int数字的值为-32768和32767,无符号的值为0到65535.在书中给出了数字42000,并显示为unsigned42000和int-23536.在VS中,它显示了as unsigned和int42000.
#include <stdio.h>
void main(void)
{
unsigned int value = 42000;
printf("Show 42000 as unsigned %u\n", value);
printf("Show 42000 as int %d\n", value);
}
Run Code Online (Sandbox Code Playgroud)
输出:
Show 42000 as unsigned 42000
Show 42000 as int 42000
Run Code Online (Sandbox Code Playgroud)
附注:尝试都%d和%i; 没用.
我尝试将signed int分配给unsigned int.
#include <stdio.h>
int main()
{
int a;
unsigned int b;
scanf("%d", &a);
b = a;
printf("%d %u\n", a, b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望编译它会导致警告我将一个int值赋给unsigned int变量.但我没有得到任何警告.
$ gcc -std=c99 -Wall -Wextra -pedantic foo.c
$ echo -1 | ./a.out
-1 4294967295
Run Code Online (Sandbox Code Playgroud)
接下来,我尝试将unsigned int分配给signed int.
#include <stdio.h>
int main()
{
int a;
unsigned int b;
scanf("%u", &b);
a = b;
printf("%d %u\n", a, b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
仍然没有警告.
$ gcc -std=c99 -Wall -Wextra -pedantic bar.c
$ echo 4294967295 | ./a.out
-1 …Run Code Online (Sandbox Code Playgroud) 当我说0b11111111是java中的一个字节时,它说"无法将int转换为byte",这是因为据我所知,11111111 = 256,java中的字节是有符号的,从-128到127.但是,如果一个字节只是8位数据,那么不是11111111 8位?我知道11111111可能是一个整数,但在我的情况下,它必须表示为一个字节,因为它必须以字节形式发送到一个文件.那么如何将一个带有位11111111的字节发送到一个文件(顺便说一句,这是我的问题)?当我尝试打印二进制值-1时,我得到11111111111111111111111111111111,为什么?我真的不明白签名字节是如何工作的.
在阅读以下问题的答案时
我不明白为什么有要投uint8_t给unsigned(或写在评论,甚至unsigned char在这之前),而铸造只是int不正确.
据我所知,没有任何转换会导致解释uint8_t成为一种基础类型,它可以(必须)成为3种char变体中的一些,从而将其作为一个字符打印出来.
但是施法有什么不对int?任何uint8_t值都应该始终适合int,因此转换似乎很简单.为什么sign-extension会使代码不正确(在评论中提到)?
UPD:
仅供参考,我想在我提到的问题中谈到的是一个案例signed char:
signed char num = -1;
std::cout << std::hex << static_cast<unsigned int>(static_cast<unsigned char>(num));
Run Code Online (Sandbox Code Playgroud)
如果f没有第二次演员,这将写成超过2 秒.
关于2的补码系统的观点似乎是不正确的,因为积分转换应该适用于将-1转换为unsigned <smth>,并且它遵循2的补数系统(即,当转换为例如uint8_t结果应该始终为255并因此被打印为0xff,甚至有不同的位模式).